API 身份認證還得看我 JWT
JWT(JSON Web Token)是一種用於身份認證的開放標準(RFC 7519),它可以在網絡應用間傳輸信息作爲 JSON 對象。JWT 由三部分組成:頭部(Header)、載荷(Payload)和簽名(Signature)。
頭部(Header):頭部通常由兩部分組成,令牌的類型(即 JWT)和所使用的簽名算法,例如:
{
"alg": "HS256",
"typ": "JWT"
}
載荷(Payload):載荷包含要傳輸的信息,可以包括用戶的身份信息、權限等。載荷可以自定義,但建議避免包含敏感信息。例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
簽名(Signature):簽名用於驗證令牌的完整性和真實性,通常通過使用頭部和載荷中的數據以及一個密鑰進行加密生成。例如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT 的工作流程如下:
用戶提供用戶名和密碼進行身份認證。
服務器驗證用戶名和密碼的正確性。
服務器使用私鑰簽發 JWT,並將其發送給客戶端。
客戶端將 JWT 存儲在本地,例如在瀏覽器的 localStorage 中。
客戶端在後續的請求中使用 JWT 進行身份認證,將其放在請求的頭部或其他位置。
服務器接收到請求後,使用公鑰驗證 JWT 的合法性和完整性。
如果 JWT 通過驗證,服務器可以根據載荷中的信息進行授權和權限驗證。 JWT 的優點包括不需要在服務器端存儲會話信息、可擴展性好、跨語言和跨平臺支持等。但需要注意的是,由於 JWT 是基於對稱或非對稱加密的,因此需要妥善保管密鑰,以防止令牌被篡改。
在 ASP.NET Core 中,可以使用 Microsoft.AspNetCore.Authentication.JwtBearer 包來實現 JWT 的身份認證。下面是一些基本的步驟:
安裝包:在項目中安裝 Microsoft.AspNetCore.Authentication.JwtBearer 包。
配置身份認證服務:在 Startup.cs 文件的 ConfigureServices 方法中添加以下代碼,以配置 JWT 身份認證服務。
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
// 添加身份認證服務
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your_issuer",
ValidAudience = "your_audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// ...
}
配置身份認證中間件:在 Startup.cs 文件的 Configure 方法中添加以下代碼,以配置身份認證中間件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseAuthentication();
// ...
app.UseAuthorization();
// ...
}
控制器中使用身份認證:在需要進行身份認證的控制器或操作方法上添加 [Authorize] 標籤。
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class MyController : ControllerBase
{
// ...
}
生成 JWT:在用戶登錄成功後,可以使用 System.IdentityModel.Tokens.Jwt 包來生成 JWT。可以在登錄控制器的操作方法中添加以下代碼:
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
// ...
[HttpPost("login")]
public IActionResult Login(string username, string password)
{
// 驗證用戶名和密碼
// 生成 JWT
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes("your_secret_key");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, username)
}),
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new { Token = tokenString });
}
以上是基本的實現步驟,通過配置 JWT 身份認證服務和中間件,以及使用 [Authorize] 標籤來保護需要認證的資源,即可實現 JWT 的身份認證功能。在生成 JWT 的過程中,可以根據需要設置有效期、加密算法等參數。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Qoe4ZYtO2bSVzecRT1DG-g