• 如何在.NET Core中使用JWT身份认证?
  • 发布于 2个月前
  • 460 热度
    0 评论
在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的生成和验证。
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
             // 堆代码 duidaima.com
            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的认证中间件:
public void Configure(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的签名算法,以维护系统的安全性。
用户评论