.NET 6 MVC应用:AD身份验证取消后401错误的代码处理
.NET 6 MVC中处理Windows Auth取消登录后返回登录页的代码方案
核心思路
当用户取消Windows身份验证弹窗时,服务器会返回401未授权响应,浏览器默认展示系统错误页。我们可以通过自定义中间件拦截401响应,将其重定向到自定义登录页面,替代默认的错误提示。
1. 实现自定义拦截中间件
创建一个中间件类,用于检测401响应并执行重定向:
public class WindowsAuthCancelMiddleware { private readonly RequestDelegate _next; public WindowsAuthCancelMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 先执行后续管道逻辑 await _next(context); // 拦截401未授权响应 if (context.Response.StatusCode == StatusCodes.Status401Unauthorized) { // 清空现有响应内容 context.Response.Clear(); // 重定向到自定义登录页(根据你的路由调整路径) context.Response.Redirect("/Account/Login"); } } }
2. 注册中间件到管道
在Program.cs中,将中间件注册到授权中间件之后,确保能捕获授权失败的401响应:
var builder = WebApplication.CreateBuilder(args); // 添加MVC服务 builder.Services.AddControllersWithViews(); // 启用Windows身份验证 builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); var app = builder.Build(); // 环境配置(保留原有逻辑) if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 注册自定义中间件 app.UseMiddleware<WindowsAuthCancelMiddleware>(); // 默认路由配置 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
3. 确保登录页允许匿名访问
在负责登录页的控制器方法上添加[AllowAnonymous]特性,避免重定向循环:
public class AccountController : Controller { [AllowAnonymous] public IActionResult Login() { return View(); } // 触发Windows Auth验证的动作方法(需授权) [Authorize] public IActionResult Authenticate() { // 验证成功后跳转到目标页面 return RedirectToAction("Index", "Home"); } }
登录页的按钮需指向上述Authenticate方法,触发Windows身份验证弹窗:
<!-- Login.cshtml --> <form asp-action="Authenticate" method="post"> <button type="submit">发起Windows登录</button> </form>
4. 开发环境配置(IIS Express)
若使用IIS Express调试,需在launchSettings.json中启用Windows身份验证:
"iisSettings": { "windowsAuthentication": true, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:5000", "sslPort": 44300 } }
内容的提问来源于stack exchange,提问作者Aequitas
相关产品推荐
相关产品推荐

