当前位置: 欣欣网 > 码农

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的签名算法,以维护系统的安全性。