ホームページ > バックエンド開発 > C++ > IIS でホストされる ASP.NET Web API に JWT ベアラー トークン認証を実装するにはどうすればよいですか?

IIS でホストされる ASP.NET Web API に JWT ベアラー トークン認証を実装するにはどうすればよいですか?

DDD
リリース: 2025-01-20 22:47:09
オリジナル
501 人が閲覧しました

How to Implement JWT Bearer Token Authentication in ASP.NET Web API Hosted on IIS?

IIS でホストされる ASP.NET Web API での JWT Bearer トークン認証の実装

IIS でホストされる ASP.NET Web API に JWT ベアラー トークン認証を実装するには、.NET Core または OWIN アプリケーションとは異なるアプローチが必要です。この記事では、この認証メカニズムの実装方法に関する包括的なガイドを提供し、主要な質問に答えます。

JWT トークンを生成するにはどうすればよいですか?

JWT トークンを生成するには、System.IdentityModel.Tokens.Jwt NuGet パッケージを使用できます。 HMACSHA256 と対称キーを使用した例を次に示します:

<code class="language-csharp">const string Secret = "db3OIsj+BXE9NZDy0t8W3TcNekrF+2d/1sFnWG4HnV8TZY30iTOdtVWJG8abWvB1GlOgJuQZdcF2Luqm/hccMw==";

public static string GenerateToken(string username, int expireMinutes = 20)
{
    var symmetricKey = Convert.FromBase64String(Secret);
    var tokenHandler = new JwtSecurityTokenHandler();

    var now = DateTime.UtcNow;
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, username) }),
        Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature)
    };

    var stoken = tokenHandler.CreateToken(tokenDescriptor);
    var token = tokenHandler.WriteToken(stoken);

    return token;
}</code>
ログイン後にコピー

JWT トークンを提供するにはどうすればよいですか?

簡単な方法は、コントローラー アクションでトークン エンドポイントを作成することです:

<code class="language-csharp">public class TokenController : ApiController
{
    [AllowAnonymous]
    public string Get(string username, string password)
    {
        if (CheckUser(username, password))
        {
            return JwtManager.GenerateToken(username);
        }

        throw new HttpResponseException(HttpStatusCode.Unauthorized);
    }

    public bool CheckUser(string username, string password)
    {
        // 应该在数据库中检查
        return true;
    }
}</code>
ログイン後にコピー

JWT トークンを確認するにはどうすればよいですか?

もう 1 つのアプローチは、IAuthenticationFilter を継承する JWTAuthenticationAttribute を作成することです。

<code class="language-csharp">private static bool ValidateToken(string token, out string username)
{
    username = null;

    var simplePrinciple = JwtManager.GetPrincipal(token);
    var identity = simplePrinciple.Identity as ClaimsIdentity;

    if (identity == null || !identity.IsAuthenticated)
        return false;

    var usernameClaim = identity.FindFirst(ClaimTypes.Name);
    username = usernameClaim?.Value;

    if (string.IsNullOrEmpty(username))
        return false;

    // 更多验证以检查系统中用户名是否存在

    return true;
}

protected Task<IPrincipal> AuthenticateJwtToken(string token)
{
    string username;

    if (ValidateToken(token, out username))
    {
        // 从数据库中的用户名获取更多信息
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username)
        };

        var identity = new ClaimsIdentity(claims, "Jwt");
        IPrincipal user = new ClaimsPrincipal(identity);

        return Task.FromResult(user);
    }

    return Task.FromResult<IPrincipal>(null);
}</code>
ログイン後にコピー

このプロパティは特定のアクションに適用できます:

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication]
    public string Get()
    {
        return "value";
    }
}</code>
ログイン後にコピー

ミドルウェアまたは DelegateHandler 経由で JWT トークンを検証しますか?

OWIN ミドルウェアまたは DelegateHandler を使用して、Web API へのすべての受信リクエストを認証することもできます。

JWT トークンを検証します

次のコードは JWT トークンを検証し、本文を返します:

<code class="language-csharp">public static ClaimsPrincipal GetPrincipal(string token)
{
    try
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

        if (jwtToken == null)
            return null;

        var symmetricKey = Convert.FromBase64String(Secret);

        var validationParameters = new TokenValidationParameters()
        {
            RequireExpirationTime = true,
            ValidateIssuer = false,
            ValidateAudience = false,
            IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
        };

        SecurityToken securityToken;
        var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

        return principal;
    }
    catch (Exception)
    {
        // 记录异常
        return null;
    }
}</code>
ログイン後にコピー

承認

匿名リクエストを防ぐために、config.Filters.Add(new AuthorizeAttribute()); をグローバルに追加することを忘れないでください。

以上がIIS でホストされる ASP.NET Web API に JWT ベアラー トークン認証を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート