使用Razor页面Authorize特性时,授权失败如何重定向至自定义拒访页?
实现Razor页面授权失败重定向到自定义页面
1. 给自定义拒绝页面开匿名访问权限
在你开发好的AccessDenied.cshtml页面顶部加上[AllowAnonymous]属性,避免因权限限制陷入循环跳转:
@page @model AccessDeniedModel [AllowAnonymous] @{ ViewData["Title"] = "访问被拒绝"; }
2. 配置认证与授权的跳转路径
根据你使用的.NET版本(.NET 6+ 用Program.cs,旧版本用Startup.cs),在服务配置中设置跳转规则:
.NET 6+ (Program.cs)
var builder = WebApplication.CreateBuilder(args); // 添加Razor页面服务 builder.Services.AddRazorPages(); // 配置Cookie认证的跳转路径 builder.Services.ConfigureApplicationCookie(options => { // 未登录(未认证)的默认跳转路径(可选,需修改默认登录页时调整) options.LoginPath = "/Account/Login"; // 重点:已登录但无权限(授权失败)时跳转到自定义页面 options.AccessDeniedPath = "/AccessDenied"; }); // 可选:用授权策略替代直接在页面写Roles(后续权限变更更灵活) builder.Services.AddAuthorization(options => { options.AddPolicy("HRFinanceAccess", policy => policy.RequireRole("HRManager", "Finance")); }); var app = builder.Build(); // 中间件配置(保留其他标准中间件) app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
3. 更新页面的授权标注
如果用了上面的自定义授权策略,把页面顶部的[Authorize(Roles = "HRManager,Finance")]替换为:
[Authorize(Policy = "HRFinanceAccess")]
不想用策略的话,继续保留原Roles标注也可,只要Cookie配置里设置了AccessDeniedPath,授权失败时会自动跳转。
额外说明
- 未登录的请求默认跳
LoginPath配置的页面,若需将未认证请求也重定向到自定义拒绝页,直接把options.LoginPath改为"/AccessDenied"即可,但通常建议保留登录页跳转,方便用户登录后重试。 - 已登录但无权限的请求,会自动跳转到你配置的自定义拒绝页面,无需额外编写代码。
内容的提问来源于stack exchange,提问作者abdulkareem amoora
相关产品推荐
相关产品推荐

