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

基于Microsoft Identity Platform的ASP.NET Core MVC 6.0角色配置方案咨询

实现方案

1. 启用角色授权配置

在Program.cs中完成身份验证与角色授权的基础配置:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

// 配置授权策略
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
    options.AddPolicy("UserAccess", policy => policy.RequireRole("Users", "Admin"));
});

// 映射JWT角色声明类型,适配Microsoft Identity返回格式
builder.Services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
    options.TokenValidationParameters.RoleClaimType = ClaimTypes.Role;
});

2. 自动为所有用户分配「Users」角色

通过IClaimsTransformation扩展用户声明,自动添加默认角色:

public class DefaultRoleClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identity = principal.Identity as ClaimsIdentity;
        // 仅当用户无Users角色时添加
        if (!principal.IsInRole("Users"))
        {
            identity?.AddClaim(new Claim(ClaimTypes.Role, "Users"));
        }
        return Task.FromResult(principal);
    }
}

在Program.cs中注册该服务:

builder.Services.AddScoped<IClaimsTransformation, DefaultRoleClaimsTransformer>();

3. 后端维护Admin用户列表并分配角色

用配置文件存储Admin用户(无需数据库),在appsettings.json中添加:

{
  "AdminUsers": [
    "admin1@yourdomain.com",
    "admin2@yourdomain.com"
  ]
}

修改之前的DefaultRoleClaimsTransformer,读取配置并为指定用户添加Admin角色:

public class DefaultRoleClaimsTransformer : IClaimsTransformation
{
    private readonly IConfiguration _config;

    public DefaultRoleClaimsTransformer(IConfiguration config)
    {
        _config = config;
    }

    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var identity = principal.Identity as ClaimsIdentity;
        var userEmail = principal.FindFirstValue(ClaimTypes.Email);

        // 添加默认Users角色
        if (!principal.IsInRole("Users"))
        {
            identity?.AddClaim(new Claim(ClaimTypes.Role, "Users"));
        }

        // 检查是否为Admin用户,添加Admin角色
        var adminUsers = _config.GetSection("AdminUsers").Get<string[]>();
        if (adminUsers != null && adminUsers.Contains(userEmail) && !principal.IsInRole("Admin"))
        {
            identity?.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
        }

        return Task.FromResult(principal);
    }
}

后续需调整Admin用户,直接修改appsettings.json重启应用即可。

4. 控制器/方法应用角色限制

在目标控制器或操作方法上添加授权属性:

// 仅允许Admin角色访问
[Authorize(Roles = "Admin")]
// 或使用预定义策略
[Authorize(Policy = "AdminOnly")]
public class AdminPanelController : Controller
{
    public IActionResult Dashboard()
    {
        return View();
    }
}

// 允许Users或Admin角色访问
[Authorize(Policy = "UserAccess")]
public class UserProfileController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

5. 验证角色生效

可在控制器或视图中查看当前用户角色:

// 控制器中获取角色
var userRoles = User.Claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value);

// 视图中显示角色
@foreach (var role in User.Claims.Where(c => c.Type == ClaimTypes.Role))
{
    <span>当前角色:@role.Value</span>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:30:39