如何为使用Identity Windows身份验证的.Net 5 WebApp添加自定义Access Denied页面
问题原因
你当前配置不生效的核心是 IISDefaults.AuthenticationScheme(Windows身份验证)的403响应不会触发Cookie认证的重定向逻辑。ConfigureApplicationCookie 配置的 AccessDeniedPath 仅对Cookie认证方案生效,而你的默认验证、挑战方案均配置为Windows认证,因此请求被拒绝时直接返回浏览器默认403页,不会走Cookie的重定向规则。
对应解决方案
方案1:使用状态码页面中间件(推荐,适配Windows身份验证场景)
这是Windows身份验证场景下实现自定义错误页最简单的方案,修改Startup.cs的Configure方法,在身份验证/授权中间件之前添加状态码处理中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他前置配置... app.UseRouting(); // 添加这行,优先处理状态码,403会重写路径到自定义页面,保留原始请求状态码 app.UseStatusCodePagesWithReExecute("/Account/AccessDenied", "?statusCode={0}"); app.UseAuthentication(); app.UseAuthorization(); // 其他后续配置... }
如果需要触发浏览器跳转,可以将UseStatusCodePagesWithReExecute替换为UseStatusCodePagesWithRedirects。
方案2:调整认证方案适配Cookie配置
如果你需要沿用Cookie的访问拒绝规则,可以修改默认挑战方案为Cookie认证,让授权失败时触发Cookie的重定向逻辑:
services.AddAuthentication(o => { o.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme; o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; // 修改挑战方案为Cookie o.DefaultSignInScheme = IdentityConstants.ExternalScheme; }) .AddIdentityCookies(o => { });
修改后你之前配置的AccessDeniedPath即可正常生效。
问题解答
你提问的「是否可以通过设置CookieAuthenticationOptions.AccessDeniedPath属性将访问被拒绝的请求重定向到自定义页面」,答案是仅当请求使用Cookie认证方案、或授权失败时的挑战方案为Cookie认证时生效,纯Windows身份验证默认配置场景下无法直接通过该配置实现。
内容的提问来源于stack exchange,提问作者Tolbxela
相关产品推荐
相关产品推荐

