Melaksanakan Pengesahan JWT dalam API Web ASP.NET tanpa perisian tengah OWIN
Artikel ini menerangkan cara melaksanakan pengesahan JWT dalam versi lama API Web ASP.NET tanpa perisian tengah OWIN. Prinsip teras adalah untuk mengeluarkan token JWT dan mengesahkannya apabila permintaan diterima.
Titik akhir penjanaan token
Menyediakan titik akhir token di mana pengguna boleh mendapatkan token JWT, mis
<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>
Gunakan System.IdentityModel.Tokens.Jwt untuk menjana token
Jana token menggunakan pakej System.IdentityModel.Tokens.Jwt NuGet dan kunci simetri 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>
Gunakan penapis pengesahan untuk pengesahan JWT
Untuk pengesahan JWT, buat penapis pengesahan tersuai yang diwarisi daripada: 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>
Pengesahan JWT menggunakan perpustakaan JWT
Untuk mengesahkan token JWT dan mendapatkan, anda boleh menggunakan perpustakaan 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>
Keizinan
Untuk menghalang permintaan tanpa nama, tambahkan konfigurasi global berikut:
<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
Ujian Posmen
Minta token menggunakan Posmen:
<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>
kaedah dan bahagian pengendalian ralat dalam kod perlu diperbaiki mengikut aplikasi sebenar. CheckUser
Kunci juga harus disimpan di tempat yang lebih selamat dan bukannya dikodkan secara langsung dalam kod. Ini hanyalah contoh ringkas, dan mekanisme pengendalian keselamatan dan ralat yang lebih komprehensif perlu dipertimbangkan dalam aplikasi sebenar. Secret
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengesahan JWT dalam API Web ASP.NET Tanpa OWIN Middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!