Implementierung der JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API
Die Implementierung der JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API erfordert einen anderen Ansatz als bei .NET Core- oder OWIN-Anwendungen. Dieser Artikel bietet eine umfassende Anleitung zur Implementierung dieses Authentifizierungsmechanismus und beantwortet wichtige Fragen:
Wie erstelle ich ein JWT-Token?
Um JWT-Tokens zu generieren, können Sie das NuGet-Paket System.IdentityModel.Tokens.Jwt verwenden. Hier ist ein Beispiel mit HMACSHA256 und einem symmetrischen Schlüssel:
<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>
Wie stellt man ein JWT-Token bereit?
Eine einfache Möglichkeit besteht darin, einen Token-Endpunkt in der Controller-Aktion zu erstellen:
<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>
Wie verifiziert man das JWT-Token?
Ein anderer Ansatz besteht darin, ein JWTAuthenticationAttribute zu erstellen, das von IAuthenticationFilter erbt:
<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>
Diese Eigenschaft kann auf bestimmte Aktionen angewendet werden:
<code class="language-csharp">public class ValueController : ApiController { [JwtAuthentication] public string Get() { return "value"; } }</code>
JWT-Token über Middleware oder DelegateHandler validieren?
OWIN-Middleware oder DelegateHandler können auch zur Authentifizierung aller eingehenden Anfragen an die Web-API verwendet werden.
JWT-Token überprüfen
Der folgende Code validiert das JWT-Token und gibt den Text zurück:
<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>
Autorisierung
Denken Sie daran, config.Filters.Add(new AuthorizeAttribute());
global hinzuzufügen, um anonyme Anfragen zu verhindern.
Das obige ist der detaillierte Inhalt vonWie implementiert man die JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!