【问题标题】:Custom error page for failed windows authentication in ASP.NET MVC applicationASP.NET MVC 应用程序中 Windows 身份验证失败的自定义错误页面
【发布时间】:2014-02-25 15:45:50
【问题描述】:

根据How to use custom Errors page in Windows Authentication(尽管从未标记为答案),您必须添加 IIS HTTP 错误处理程序以“捕获”失败的 Windows 身份验证并提供自定义错误页面。

但是,永远无法达到 403,失败的 WinAuth 以 401 Unauthorized 结束。但是,如果我为 401 添加 IIS HTTP 错误处理程序,NTLM 身份验证过程将不再起作用(内部也使用 401)。

当 Windows 身份验证失败时,任何人都有自定义错误页面(不是静态的,我想执行 MVC 控制器操作!)的有效解决方案?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-5 windows-authentication custom-error-pages


    【解决方案1】:

    下面的代码并不是您所需要的,但这就是我处理未处理异常的方式。您可以根据状态代码或异常类型更改此路由以进行不同的路由。 (来自 Global.asax)

     protected void Application_Error(object sender, EventArgs e)
                {
                    var ex = Server.GetLastError().GetBaseException();
                    Server.ClearError();
    
                    var routeData = new RouteData();
                    routeData.Values.Add("controller", "Error");
                    routeData.Values.Add("action", "Global");
                    int status = 0;
    
                    if (ex.GetType() == typeof(HttpException))
                    {
                        var httpException = (HttpException)ex;
                        var code = httpException.GetHttpCode();
                        status = code;
                    }
                    else
                    {
                        status = 500;
                    }
    
                    //Create a new error based off the exception and the error status.
                    NameSpace.Models.ErrorModel Error = new ErrorModel(status, ex);
                    string innerException = "";
                    if (ex.InnerException != null)
                    {
                        innerException = "\n Inner Ex: " + ex.InnerException.StackTrace;
                    }
    
                    log.Error("Error Id: " + Error.ErrorId + " Error: " + ex.Message + ". Stack Trace: " + ex.StackTrace + innerException);
                    routeData.Values.Add("error", Error);
    
                    IController errorController = new NameSpace.Controllers.ErrorController();
                    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    
    
                }
    

    更新:抱歉,我没有完整阅读您的帖子。如果您要在应用程序中执行 LDAP 身份验证,您可以利用上面的代码通过控制器捕获和处理错误。很遗憾,我无法就您的上述问题提供直接指导。

    【讨论】:

    • 您确定 ASP.NET 管道因 win auth 错误而被调用吗?无法观察到这种行为...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多