.NET 6 Web应用基于策略授权报InvalidOperationException错误求助
解决.NET 6 Web应用基于策略的身份验证错误
问题根源
该错误是因为仅配置了授权策略,但未指定认证方案(AuthenticationScheme),也没有设置默认的挑战方案(DefaultChallengeScheme),ASP.NET Core无法确定用哪种认证方式处理身份验证流程(比如未授权时的跳转逻辑)。
解决步骤
1. 在Program.cs中配置认证服务
添加AddAuthentication并指定默认认证方案,同时配置Cookie认证(Web应用常用的认证方式):
// 引入命名空间(如果缺失) using Microsoft.AspNetCore.Authentication.Cookies; // 先配置认证服务 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 根据实际路由配置登录路径 options.LoginPath = "/Account/Login"; // 配置权限不足时的跳转路径 options.AccessDeniedPath = "/Account/AccessDenied"; // 可按需添加其他Cookie配置,比如过期时间、SameSite规则等 }); // 保留已有的授权策略配置 builder.Services.AddAuthorization(options => { options.AddPolicy(Constants.Policies.RequireGlobalAdminRole, policy => policy.RequireRole(Constants.Roles.GlobalAdmin)); });
2. 调整登录逻辑中的ClaimsIdentity创建
创建ClaimsIdentity时需要指定对应的认证Scheme,确保和前面配置的默认方案一致:
var claims = new List<Claim> { new Claim(ClaimTypes.Role, Data.User.Role.RoleName) }; // 指定认证Scheme为Cookie认证的默认值 var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var claimsPrincipal = new ClaimsPrincipal(identity); // 调用SignInAsync完成用户登录,将身份信息写入Cookie await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsPrincipal);
3. 确保中间件顺序正确
在Program.cs的管道配置中,认证中间件必须在授权中间件之前:
app.UseAuthentication(); // 先执行认证 app.UseAuthorization(); // 再执行授权
验证
完成以上修改后,登录系统时会正确将用户身份写入Cookie,访问Dashboard控制器时,ASP.NET Core会通过Cookie认证验证用户身份,并检查是否符合指定的授权策略,即可解决该错误。
内容的提问来源于stack exchange,提问作者user19577618
相关产品推荐
相关产品推荐

