OWIN ミドルウェアを使用しない ASP.NET Web API での JWT 認証の実装
この記事では、OWIN ミドルウェアを使用せずに、古いバージョンの ASP.NET Web API で JWT 認証を実装する方法について説明します。基本的な原則は、JWT トークンを発行し、リクエストを受信したときにそれを検証することです。
トークン生成エンドポイント
ユーザーが 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); } private bool CheckUser(string username, string password) { // 应在数据库中进行检查 return true; // 此处应替换为实际的用户验证逻辑 } }</code>
System.IdentityModel.Tokens.Jwt を使用してトークンを生成します
System.IdentityModel.Tokens.Jwt NuGet パッケージと 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>
JWT 検証に認証フィルターを使用する
JWT 検証の場合、 から継承したカスタム認証フィルターを作成します: IAuthenticationFilter
<code class="language-csharp">public class ValueController : ApiController { [JwtAuthentication] // 自定义过滤器属性 public string Get() { return "value"; } }</code>
を返します: 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>
JWT ライブラリを使用した JWT 検証
JWT トークンを検証して を取得するには、JWT ライブラリを使用できます: ClaimsPrincipal
<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>
承認
匿名リクエストを防ぐには、次のグローバル構成を追加します:
<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
郵便配達員テスト
Postman を使用してトークンをリクエストします:
<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
<code>GET http://localhost:{port}/api/value Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
メソッドとエラー処理部分は、実際のアプリケーションに応じて改善する必要があることに注意してください。 CheckUser
キーは、コードに直接ハードコーディングするのではなく、より安全な場所に保存する必要もあります。 これは単なる例であり、実際のアプリケーションでは、より包括的なセキュリティとエラー処理メカニズムを考慮する必要があります。 Secret
以上がOWIN ミドルウェアを使用せずに ASP.NET Web API に JWT 認証を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。