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和對稱金鑰的範例:
<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令牌?
另一個方法是建立一個從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中文網其他相關文章!