Ich bin vor ein paar Tagen in dieses Problem geraten und die Lösung ist ein bisschen detailliert, aber hier sind die wichtigen Bits. In AuthorizeAttribute
gibt die Methode OnAuthorization
eine HttpUnauthorizedResult
zurück, wenn die Autorisierung fehlschlägt, was die Rückgabe eines benutzerdefinierten Ergebnisses ein wenig schwierig macht.
Was ich getan habe, war, eine CustomAuthorizeAttribute-Klasse zu erstellen und die OnAuthorization-Methode zu überschreiben, um stattdessen eine Ausnahme auszulösen. Ich kann dann diese Ausnahme mit einer benutzerdefinierten Fehlerbehandlungsroutine abfangen und eine angepasste Fehlerseite anzeigen, anstatt eine 401 (nicht autorisiert) zurückzugeben.
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
und dann implementieren Sie Ihre eigene Errorcontroller zu dienen benutzerdefinierte Seiten:
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");
}
}
}
dann in Ihrer web.config können Sie benutzerdefinierte Handler für bestimmte Fehler gesetzt.
Auf IIS7 müssen Sie in die Einstellung Response.TrySkipIisCustomErrors = true;
suchen, um Ihre benutzerdefinierten Fehler zu aktivieren.
also diese Logik verwenden, müsste ich Teilansichten mit "freundliche Nachrichten" korrigieren? Ist es nicht möglich, die gesamte Aktionsmethode mit einem Attribut zu kombinieren, das dasselbe tut? – Kyle
Ich habe oben ein Beispiel hinzugefügt. Ihre andere Möglichkeit besteht natürlich darin, Ihr eigenes Attribut zu schreiben, wie Sie es genannt haben (das wäre zwar der sauberste, aber härtere Unit-Test), aber das ist definitiv kein Out-of-the-Box-Ansatz. –