Ошибка HTTP 401.0 Asp.Net MVC - Несанкционированный

У меня есть приложение MVC, которое использует авторизацию утверждений на основе отличного учебника, доступного здесь. В коде я переопределяю метод CheckAccess класса ClaimsAuthorizationManager, чтобы реализовать мою собственную логику для каждого ресурса и действия.

public class CustomAuthorisationManager : ClaimsAuthorizationManager
{
    public override bool CheckAccess(AuthorizationContext context)
    {
        string resource = context.Resource.First().Value;
        string action = context.Action.First().Value;

        if (action == "Show" && resource == "Code")
        {
            bool livesInScotland = context.Principal.HasClaim(ClaimTypes.Country, "Scotland");
            return livesInScotland;
        }

        return false;
    }
}

И все работает нормально, за исключением того факта, что всякий раз, когда метод CheckAccess возвращает false, я получаю HTTP-ошибку 401.0 - Неавторизованный, которая, как я читал, может обрабатываться только IIS. Мой вопрос в том, как я могу обработать эту ошибку в коде, чтобы отобразить пользовательскую страницу ошибки. Я видел много разных решений, например здесь или здесь, но мне так и не удалось заставить его работать.


person Bartosz    schedule 15.04.2014    source источник


Ответы (1)


Вы можете реализовать IHttpModule. Руководство по его реализации можно найти здесь < / а>. Преимущество httpmodule в том, что вы можете поймать практически любой HTTP-ответ и делать с ним все, что хотите.

Или вы можете посмотреть этот вопрос SO. Может тебе больше понравится.

person pepo    schedule 15.04.2014
comment
Я пробовал решение IHttpModule, но мое приложение не видит модуль. Вы уверены, что его можно использовать в MVC. Что касается второго решения, оно относится только к ошибкам 404 и 500, которые обрабатываются ASP, в то время как, насколько мне известно, 401 разрешается IIS (см. Здесь: patrickdesjardins.com/blog/) - person Bartosz; 16.04.2014
comment
HttpModule действует на уровне IIS, а не MVC. Но когда вы отлаживаете, отладчик вашего приложения войдет в модуль, если у вас там есть точка останова. Были ли у вас с этим проблемы? Мы зарегистрировали модуль в <system.webServer><modules> и установили <httpErrors existingResponse="PassThrough" errorMode="Detailed"> <clear /> </httpErrors>. С этим у нас не было проблем. - person pepo; 16.04.2014