當前位置: 妍妍網 > 碼農

ASP.NET Core 實戰:基於 Jwt Token 的許可權控制全揭露

2024-02-18碼農

在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的簽名演算法,以維護系統的安全性。