ASP.NET MVC удобная для пользователя 401 ошибка

Вы могли придерживаться самых строгих и самых чистых принципов ООП и гарантировать, чтобы никакие элементы данных для любого класса даже не имели средства доступа так, чтобы все объекты были должны быть единственными, которые могут знать об их данных с единственным способом действовать на них, через косвенный сообщения , т.е. методы.

, Но даже C# имеет внутренний , ключевое слово видимости и Java имеют свое значение по умолчанию пакет доступность уровня для некоторых вещей. C++ прибывает на самом деле ближе в идеал ООП minimizinbg компромисс видимости в класс путем определения точно , который другой класс и [только 1 114] другие классы видели в него.

я действительно не использую C++, но если C# имел друг с, я был бы, что вместо глобального блоком внутренний модификатор, который я на самом деле использую много. Это действительно не повреждает incapsulation, потому что единица развертывания в.NET блок.

, Но тогда существует Атрибут InternalsVisibleTo (otherAssembly), который действует как перекрестный блок друг механизм. Microsoft использует это для визуального разработчик блоки.

18
задан Community 23 May 2017 в 12:18
поделиться

3 ответа

Посмотрите на атрибут HandleErrorAttribute. Создайте подкласс от него или добавьте свою собственную реализацию, которая будет обрабатывать все интересующие вас коды состояния. Вы можете сделать так, чтобы он возвращал отдельное представление ошибки для каждого типа ошибки.

Вот идея того, как создать свой дескриптор ошибки фильтр исключений. Я выбросил большую часть вещей, чтобы сосредоточиться только на самом главном. Обязательно посмотрите на исходную реализацию, чтобы добавить проверки аргументов и другие важные вещи.

public class HandleManyErrorsAttribute : FilterAttribute, IExceptionFilter
{
    public virtual void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            return;

        Exception exception = filterContext.Exception;

        string viewName = string.Empty;
        object viewModel = null;
        int httpCode = new HttpException(null, exception).GetHttpCode();
        if (httpCode == 500)
        {
            viewName = "Error500View";
            viewModel = new Error500Model();
        }
        else if (httpCode == 404)
        {
            viewName = "Error404View";
            viewModel = new Error404Model();
        }
        else if (httpCode == 401)
        {
            viewName = "Error401View";
            viewModel = new Error401Model();
        }

        string controllerName = (string)filterContext.RouteData.Values["controller"];
        string actionName = (string)filterContext.RouteData.Values["action"];
        filterContext.Result = new ViewResult
        {
            ViewName = viewName,
            MasterName = Master,
            ViewData = viewModel,
            TempData = filterContext.Controller.TempData
        };
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = httpCode;

        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}

Затем вы «украшаете» действия вашего контроллера этим атрибутом:

[HandleManyErrors]
public ActionResult DoSomethingBuggy ()
{
    // ...
}
14
ответ дан 30 November 2019 в 09:03
поделиться

Если вы используете ASP.NET MVC, вам больше, чем вероятно, будет использовать IIS, так почему бы вам просто не настроить IIS для использования пользовательской страницы ошибки 401 для этого веб-приложения / виртуального каталога?

0
ответ дан 30 November 2019 в 09:03
поделиться

Мне удалось решить это очень простой способ. Я хотел показать пользовательскую страницу для зарегистрированных пользователей («У вас нет разрешения BLA BLA ...») и перенаправляйте ненужные пользователи на странице входа (поведение по умолчанию). Поэтому я реализовал пользовательский авторизентрибут (скажем, customauthorizeAttribute) с помощью метода HilluNAuthorizeRequest, перезаписываемый таким образом, что если пользователь аутентифицирован, я устанавливаю свойство результата аргумента результатов аргумента FilterContext с помощью ViewResult (в общей папке), называемое AccessDoded.aspx

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
    else
    {
        filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
    }
}

Вы должны использовать этот новый атрибут вместо этого. С уважением.

6
ответ дан 30 November 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: