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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:15:38