Wpadłem na ten problem kilka dni temu, a rozwiązanie jest nieco szczegółowe, ale tutaj są ważne fragmenty. W trybie AuthorizeAttribute
metoda HttpUnauthorizedResult
zwraca wartość HttpUnauthorizedResult
, gdy autoryzacja kończy się niepowodzeniem, co sprawia, że zwracanie wyniku niestandardowego jest nieco utrudnione.
W efekcie stworzyłem klasę CustomAuthorizeAttribute i nadpisałem metodę OnAuthorization, aby zamiast tego wygenerować wyjątek. Mogę następnie przechwycić ten wyjątek za pomocą niestandardowej procedury obsługi błędów i wyświetlić niestandardową stronę błędu zamiast zwracać 401 (nieautoryzowane).
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");
}
}
}
następnie w Twojej web.config można ustawić niestandardowe procedury obsługi dla konkretnych błędów:
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
a następnie zaimplementować własną ErrorController służyć do stron niestandardowych.
W IIS7 należy sprawdzić ustawienie Response.TrySkipIisCustomErrors = true;
, aby włączyć niestandardowe błędy.
więc używając tej logiki, musiałbym zwrócić częściowe widoki z "przyjaznymi wiadomościami" poprawnymi? Czy nie można objąć całej metody działania atrybutem, który robi to samo? – Kyle
Dodałem przykład powyżej. Inną opcją jest oczywiście pisanie własnego atrybutu, o którym wspomniałeś (który byłby najczystszy, choć trudniejszy do testowania jednostkowego), ale nie jest to z pewnością podejście nieszablonowe. –