Implémentation de l'authentification par jeton JWT Bearer dans l'API Web ASP.NET hébergée sur IIS
La mise en œuvre de l'authentification par jeton du porteur JWT dans l'API Web ASP.NET hébergée sur IIS nécessite une approche différente par rapport aux applications .NET Core ou OWIN. Cet article fournit un guide complet sur la façon de mettre en œuvre ce mécanisme d'authentification et répond aux questions clés :
Comment générer un token JWT ?
Pour générer des jetons JWT, vous pouvez utiliser le package System.IdentityModel.Tokens.Jwt NuGet. Voici un exemple utilisant HMACSHA256 et une clé symétrique :
<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>
Comment fournir un jeton JWT ?
Un moyen simple consiste à créer un point de terminaison de jeton dans l'action du contrôleur :
<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>
Comment vérifier le jeton JWT ?
Une autre approche consiste à créer un JWTAuthenticationAttribute qui hérite de IAuthenticationFilter :
<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>
Cette propriété peut être appliquée à des actions spécifiques :
<code class="language-csharp">public class ValueController : ApiController { [JwtAuthentication] public string Get() { return "value"; } }</code>
Valider le jeton JWT via middleware ou DelegateHandler ?
Le middleware OWIN ou DelegateHandler peut également être utilisé pour authentifier toutes les requêtes entrantes auprès de l'API Web.
Vérifier le jeton JWT
Le code suivant valide le token JWT et renvoie le corps :
<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>
Autorisation
N'oubliez pas d'ajouter config.Filters.Add(new AuthorizeAttribute());
globalement pour éviter les demandes anonymes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!