You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET Core中无需Identity Server实现多角色用户授权的最佳方案

.NET Core JwtBearer 多角色认证授权实现方案

1. 配置JWT认证服务

在Program.cs中注册并配置JWT认证服务,核心是确保角色声明类型与后续生成Token时的配置匹配:

var builder = WebApplication.CreateBuilder(args);

// 添加JWT认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),
            // 指定角色声明类型,默认对应ClaimTypes.Role,需与生成Token时一致
            RoleClaimType = ClaimTypes.Role
        };
    });

// 注册授权服务
builder.Services.AddAuthorization();

2. 生成包含多角色的JWT Token

编写Token生成方法,通过在Claims集合中添加多个ClaimTypes.Role类型的声明,实现单用户多角色绑定:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

public string GenerateJwtToken(string userId, List<string> roles)
{
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, userId)
    };

    // 为用户添加多个角色声明
    foreach (var role in roles)
    {
        claims.Add(new Claim(ClaimTypes.Role, role));
    }

    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: Configuration["Jwt:Issuer"],
        audience: Configuration["Jwt:Audience"],
        claims: claims,
        expires: DateTime.Now.AddHours(1),
        signingCredentials: creds);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

调用示例:

// 为用户分配Admin和Editor两个角色
var token = GenerateJwtToken("user123", new List<string> { "Admin", "Editor" });

3. 基于角色的授权验证

在控制器或接口上使用[Authorize]特性指定允许访问的角色:

单角色授权

仅允许Admin角色访问:

[Authorize(Roles = "Admin")]
[HttpGet("admin-only")]
public IActionResult AdminOnly()
{
    return Ok("仅管理员可访问");
}

多角色授权

允许Admin或Editor角色访问:

[Authorize(Roles = "Admin,Editor")]
[HttpGet("admin-or-editor")]
public IActionResult AdminOrEditor()
{
    return Ok("管理员或编辑可访问");
}

全局授权(可选)

如果需要默认所有接口都要求授权,可在Program.cs中添加全局过滤器:

builder.Services.AddControllers(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
});

关键注意事项

  • 生成Token时的角色声明类型必须与认证配置中的RoleClaimType完全一致,否则授权逻辑无法识别角色
  • 确保JWT配置(密钥、Issuer、Audience)在生成Token和认证配置中完全匹配
  • 若需自定义角色声明类型(如不用ClaimTypes.Role),需在两端同步修改,例如:
    // 认证配置中
    RoleClaimType = "CustomRole";
    // 生成Token时
    claims.Add(new Claim("CustomRole", role));
    

内容的提问来源于stack exchange,提问作者DNDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:15:44