基于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
相关产品推荐
相关产品推荐

