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

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

DDD
DDDオリジナル
2025-01-20 22:47:09597ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。