Я столкнулся с этой проблемой несколько дней назад, и решение немного подробное, но вот важные моменты. В 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;
, чтобы включить ваши собственные ошибки.