Пользовательская страница ошибки для неудачной проверки подлинности Windows в приложении ASP.NET MVC

Согласно Как использовать пользовательскую страницу ошибок при проверке подлинности Windows (хотя никогда не помечался как ответ), вам нужно добавить обработчик ошибок IIS HTTP, чтобы «отлавливать» неудачные проверки подлинности Windows и обслуживать пользовательскую страницу ошибок.

Однако 403 никогда не достигается, сбой WinAuth заканчивается 401 Unauthorized. Однако, если я добавлю обработчик ошибок IIS HTTP для 401, процесс аутентификации NTLM больше не будет работать (также использует 401 внутри).

У кого-нибудь есть рабочее решение для пользовательской страницы ошибок (не статической, я хочу выполнить действие контроллера MVC!), Когда аутентификация Windows не удалась?


person D.R.    schedule 25.02.2014    source источник


Ответы (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 в своем приложении, вы могли бы использовать приведенный выше код для перехвата и обработки ошибки с помощью контроллера. К сожалению, я не могу дать прямого указания по вашей проблеме выше.

person stead    schedule 25.02.2014
comment
Вы уверены, что конвейер ASP.NET вызывается для ошибок аутентификации win? Не могу наблюдать за этим поведением... - person D.R.; 26.02.2014