.NET Core 3.1用户认证后如何为其分配符合要求的Authorization Policy
问题根因
你遇到的授权失效问题由两个配置错误共同导致:
- Razor页面文件夹绑定的授权策略名称与实际定义的策略名称不匹配
- 授权策略中校验的声明类型与登录时写入的声明类型不一致
修复步骤
1. 修正授权策略名称匹配
你在AddRazorPagesOptions中给/NonCourt_Users文件夹绑定的策略名为Non Court User,但实际通过AddPolicy定义的策略名为NonCourt_Users,名称不匹配会导致系统找不到对应授权策略,默认判定授权失败。
修改Startup代码中的Razor页面配置段:
services.AddRazorPages().AddRazorPagesOptions(options => { // 修正第二个参数为你实际定义的策略名,和AddPolicy的参数一致 options.Conventions.AuthorizeFolder("/NonCourt_Users","NonCourt_Users"); options.Conventions.AuthorizeFolder("/Court_Users","Court_Users"); options.Conventions.AllowAnonymousToPage("/Shared"); });
2. 修正声明类型校验逻辑
你在授权策略中使用.RequireClaim("role", "Court User")校验类型为role的声明,但登录代码中写入的是ClaimTypes.Role类型的声明,ClaimTypes.Role的默认值是http://schemas.microsoft.com/ws/2008/06/identity/claims/role,和字符串role完全不同,导致校验永远不通过。
两种修正方案二选一即可:
方案A:使用内置角色校验方法
services.AddAuthorization(options => { options.AddPolicy("Court_Users", new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() // 改用RequireRole方法,自动适配ClaimTypes.Role类型的声明 .RequireRole("Court User") .Build()); options.AddPolicy("NonCourt_Users", new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .RequireRole("Non Court User") .Build()); });
方案B:显式指定校验的声明类型为ClaimTypes.Role
services.AddAuthorization(options => { options.AddPolicy("Court_Users", new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .RequireClaim(ClaimTypes.Role, "Court User") .Build()); options.AddPolicy("NonCourt_Users", new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .RequireClaim(ClaimTypes.Role, "Non Court User") .Build()); });
3. 确认中间件顺序
请检查Startup的Configure方法中,中间件顺序必须为UseAuthentication在前、UseAuthorization在后,顺序颠倒也会导致授权失效:
app.UseRouting(); // 先认证再授权,顺序不能换 app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages();
修复完成后,携带对应角色声明的用户即可正常访问对应文件夹下的页面。
内容的提问来源于stack exchange,提问作者user9758771
相关产品推荐
相关产品推荐

