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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:22