首頁 > 後端開發 > C++ > 如何在 IIS 上託管的 ASP.NET Web API 中實作 JWT 不記名令牌身份驗證?

如何在 IIS 上託管的 ASP.NET Web API 中實作 JWT 不記名令牌身份驗證?

DDD
發布: 2025-01-20 22:47:09
原創
564 人瀏覽過

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 bearer令牌驗證,與.NET Core或OWIN應用程式相比,需要採用不同的方法。本文提供了一個全面的指南,介紹如何實現這種身份驗證機制,並解答關鍵問題:

如何產生JWT令牌?

要產生JWT令牌,可以使用System.IdentityModel.Tokens.Jwt NuGet套件。以下是用HMACSHA256和對稱金鑰的範例:

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;
}
登入後複製

如何提供JWT令牌?

一個簡單的方法是在控制器操作中建立一個令牌端點:

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;
    }
}
登入後複製

如何驗證JWT令牌?

另一個方法是建立一個從IAuthenticationFilter繼承的JWTAuthenticationAttribute:

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);
}
登入後複製

此屬性可以套用於特定操作:

public class ValueController : ApiController
{
    [JwtAuthentication]
    public string Get()
    {
        return "value";
    }
}
登入後複製

透過中間件或DelegateHandler驗證JWT令牌?

OWIN中間件或DelegateHandler也可以用來驗證Web API的所有傳入請求。

驗證JWT令牌

以下程式碼驗證JWT令牌並回傳主體:

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;
    }
}
登入後複製

授權

請記住全域新增config.Filters.Add(new AuthorizeAttribute()); 以防止匿名要求。

以上是如何在 IIS 上託管的 ASP.NET Web API 中實作 JWT 不記名令牌身份驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板