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

IdentityServer4客户端OIDC中间件抛异常后跳转Login.aspx报错问题

问题根源分析

这个问题我之前帮几个开发者排查过,核心原因其实是ASP.NET默认的Forms认证模块还在悄悄生效,和你配置的OIDC中间件冲突了。当OIDC中间件抛出异常后,ASP.NET的错误处理流程会触发Forms认证的“未认证重定向”逻辑,试图跳转到默认的/login.aspx页面,但你的MVC项目根本没有这个页面(也不需要),所以才会报“控制器找不到”的错误。另外,OIDC中间件的异常属于管道早期的异常,可能被中间件本身或者ASP.NET的认证管道拦截了,没传到Global.asax的Application_Error()方法。

解决方案步骤

1. 彻底禁用Forms认证

打开项目的web.config,做两个关键修改:

  • 在<system.web>节点下,把认证模式改为None,直接关闭Forms认证的默认逻辑:
    <system.web>
      <authentication mode="None" />
      <!-- 其他原有配置... -->
    </system.web>
    
  • 在<system.webServer>的<modules>节点下,移除FormsAuthentication模块,防止它被ASP.NET自动加载:
    <system.webServer>
      <modules>
        <remove name="FormsAuthentication" />
        <!-- 其他原有模块配置... -->
      </modules>
      <!-- 其他原有配置... -->
    </system.webServer>
    

2. 直接捕获OIDC中间件的远程异常

OIDC中间件本身提供了OnRemoteFailure事件,专门用来处理认证过程中(比如和IdentityServer通信时)的异常,你可以在这里直接捕获并处理,不用依赖Application_Error。在Startup.cs的OIDC配置里加上这个事件:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
    // 你的原有OIDC配置,比如ClientId、Authority、RedirectUri等
    // ...
    Events = new OpenIdConnectAuthenticationEvents
    {
        OnRemoteFailure = context =>
        {
            // 这里直接捕获OIDC中间件抛出的异常
            var authException = context.Failure;
            // 可以先记录异常日志
            // 然后跳转到你的自定义错误页面
            context.Response.Redirect("/Error/AuthenticationError?msg=" + Uri.EscapeDataString(authException.Message));
            // 标记异常已处理,避免后续流程再触发错误
            context.HandleResponse();
            return Task.FromResult(0);
        }
    }
});

3. 确保Application_Error能捕获剩余异常

如果你还是希望Global.asax的Application_Error()能处理其他非认证类的异常,需要调整两个配置:

  • 在Global.asax里完善异常处理逻辑,确保能正确获取并处理异常:
    protected void Application_Error(object sender, EventArgs e)
    {
        var exception = Server.GetLastError();
        // 记录异常日志(建议用日志框架,比如Serilog、NLog)
        // 跳转到自定义错误页面
        Response.Redirect("/Error/GeneralError");
        // 清除异常,避免重复处理
        Server.ClearError();
    }
    
  • 在web.config里调整自定义错误模式,开发环境可以设为Off方便调试,生产环境设为On或RemoteOnly:
    <system.web>
        <customErrors mode="Off" />
        <!-- 其他原有配置... -->
    </system.web>
    
额外注意事项
  • 检查项目中是否还有引用System.Web.Security.FormsAuthentication相关的代码,如果有建议移除,避免意外触发Forms认证逻辑。
  • 确保IdentityServer4和OIDC中间件的版本匹配,版本不兼容也可能导致一些奇怪的异常触发逻辑。

内容的提问来源于stack exchange,提问作者JakeJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:09:54