Implémentation de l'authentification JWT dans l'API Web ASP.NET sans middleware OWIN
Cet article décrit comment implémenter l'authentification JWT dans l'ancienne version de l'API Web ASP.NET sans middleware OWIN. Le principe de base est d'émettre des jetons JWT et de les valider lorsqu'une demande est reçue.
Point de terminaison de génération de jetons
Fournit un point de terminaison de jeton où les utilisateurs peuvent obtenir un jeton JWT, par exemple en utilisant une simple implémentation d'une action de 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); } private bool CheckUser(string username, string password) { // 应在数据库中进行检查 return true; // 此处应替换为实际的用户验证逻辑 } }</code>
Utilisez System.IdentityModel.Tokens.Jwt pour générer des jetons
Générez des jetons à l'aide du package System.IdentityModel.Tokens.Jwt NuGet et de la clé symétrique HMACSHA256 :
<code class="language-csharp">/// <summary> /// 使用以下代码生成对称密钥 /// var hmac = new HMACSHA256(); /// var key = Convert.ToBase64String(hmac.Key); /// </summary> private 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(expireMinutes), SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature) }; var stoken = tokenHandler.CreateToken(tokenDescriptor); var token = tokenHandler.WriteToken(stoken); return token; }</code>
Utiliser le filtre d'authentification pour la vérification JWT
Pour la validation JWT, créez un filtre d'authentification personnalisé hérité de IAuthenticationFilter
:
<code class="language-csharp">public class ValueController : ApiController { [JwtAuthentication] // 自定义过滤器属性 public string Get() { return "value"; } }</code>
Dans le filtre d'authentification, implémentez la logique de vérification et renvoyez ClaimsPrincipal
:
<code class="language-csharp">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>
Vérification JWT à l'aide de la bibliothèque JWT
Afin de vérifier le token JWT et d'obtenir ClaimsPrincipal
, vous pouvez utiliser la bibliothèque 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>
Autorisation
Pour éviter les demandes anonymes, ajoutez la configuration globale suivante :
<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
Test du facteur
Demander un jeton en utilisant Postman :
<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
Utilisez le token JWT obtenu dans l'en-tête de la demande d'autorisation :
<code>GET http://localhost:{port}/api/value Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
Veuillez noter que les CheckUser
méthodes et parties de gestion des erreurs dans le code doivent être améliorées en fonction des applications réelles. Secret
Les clés doivent également être stockées dans un endroit plus sécurisé plutôt que d'être codées en dur directement dans le code. Ceci n'est qu'un exemple simplifié, et des mécanismes de sécurité et de gestion des erreurs plus complets doivent être pris en compte dans les applications réelles.
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!