Я столкнулся с этим вопросом несколько дней назад, и решение немного детализировано, но вот важные бит. В AuthorizeAttribute
метод OnAuthorization
возвращает HttpUnauthorizedResult
, когда сбой авторизации, что затрудняет возврат пользовательского результата.
Что я в итоге сделал, это создать класс CustomAuthorizeAttribute и переопределить метод OnAuthorization, чтобы исключить исключение. Затем я могу поймать это исключение с помощью специального обработчика ошибок и отобразить настроенную страницу ошибки вместо возврата 401 (неавторизованный).
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public virtual void OnAuthorization(AuthorizationContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
if (AuthorizeCore(filterContext.HttpContext)) {
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
else {
// auth failed, redirect to login page
// filterContext.Result = new HttpUnauthorizedResult();
throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}
}
}
то в вашем web.config вы можете установить пользовательские обработчики для специфических ошибок:
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
, а затем реализовать свой собственный ErrorController обслуживать до пользовательских страниц.
На IIS7 вам необходимо изучить настройки Response.TrySkipIisCustomErrors = true;
, чтобы включить пользовательские ошибки.
так используя эту логику, мне нужно будет вернуть частичные виды с «дружескими сообщениями» правильно? Невозможно ли охватить весь метод действия с помощью атрибута, который делает то же самое? – Kyle
Я добавил пример выше. Ваш другой вариант, конечно же, написание вашего собственного атрибута, как вы упомянули (что было бы самым чистым, хотя и более жестким для модульного теста), но это определенно не «готовый» подход. –