在ASP.NET Core中,基於Jwt(JSON Web Tokens)的許可權控制是一種常見的安全策略。Jwt Token提供了一種無狀態的認證方式,允許客戶端在每次請求時攜帶一個加密的令牌,以證明其身份和授權資訊。本文將詳細介紹如何在ASP.NET Core中實作基於Jwt Token的許可權控制,包括生成Token、驗證Token以及基於角色和策略的授權。
1. 生成Jwt Token
首先,你需要安裝相關的NuGet包,如
Microsoft.AspNetCore.Authentication.JwtBearer
。然後,在Startup類的
ConfigureServices
方法中配置Jwt Token的生成和驗證。
publicvoidConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "YourIssuer", // 設定Issuer
ValidAudience = "YourAudience", // 設定Audience
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey")) // 設定金鑰
};
});
}
在登入成功後,你可以使用以下程式碼生成Jwt Token:
public IActionResult Login([FromBody] LoginViewModel model)
{
// 驗證使用者名稱和密碼
if (model.Username == "admin" && model.Password == "password")
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, model.Username),
new Claim(ClaimTypes.Role, "Admin") // 添加角色聲明
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
"YourIssuer",
"YourAudience",
claims,
expires: DateTime.Now.AddDays(1),
signingCredentials: creds);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
return Unauthorized();
}
2. 驗證Jwt Token
在Startup類的
Configure
方法中,確保啟用了Jwt Token的認證中介軟體:
publicvoidConfigure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication(); // 確保在UseRouting之前呼叫
app.UseRouting();
// ... 其他中介軟體
}
對於需要身份驗證的控制器或操作,可以使用
[Authorize]
內容。
3. 基於角色和策略的授權
在Jwt Token中,你可以添加角色聲明來實作基於角色的授權。在Startup類的
ConfigureServices
方法中配置角色策略:
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
});
然後在控制器或操作上套用策略:
[Authorize(Policy = "RequireAdminRole")]
public IActionResult AdminOnly()
{
return Ok("This action is restricted to users with the Admin role.");
}
4. 使用Jwt Token進行請求認證
客戶端在登入成功後,應儲存返回的Jwt Token,並在每個請求的
Authorization
頭中攜帶此Token。
GET /api/adminonly
Authorization: Bearer <YourJwtToken>
ASP.NET Core套用將自動驗證Token,並根據其中的聲明執行相應的授權策略。
總結
基於Jwt Token的許可權控制為ASP.NET Core套用提供了一種靈活且安全的認證和授權機制。透過配置Token的生成和驗證,結合角色和策略的使用,你可以輕松地在套用中實作復雜的許可權控制邏輯。確保保護好你的金鑰,並經常更新Token的簽名演算法,以維護系統的安全性。