Bei der ersten Entwicklung hat System.Web.Mvc.AuthorizeAttribute das Richtige getan - ältere Revisionen der HTTP-Spezifikation verwendeten den Statuscode 401 sowohl für "nicht autorisiert" als auch für "nicht authentifiziert".
Aus der ursprünglichen Spezifikation:
Wenn die Anforderung bereits Berechtigungsnachweise enthielt, zeigt die Antwort 401 an, dass die Berechtigung für diese Anmeldeinformationen verweigert wurde.
In der Tat können Sie die Verwirrung genau dort sehen - es verwendet das Wort "Autorisierung", wenn es "Authentifizierung" bedeutet. In der täglichen Praxis ist es jedoch sinnvoller, einen 403 Forbidden zurückzugeben, wenn der Benutzer authentifiziert, aber nicht autorisiert ist. Es ist unwahrscheinlich, dass der Benutzer über einen zweiten Satz von Anmeldeinformationen verfügt, die ihm Zugriff gewähren - eine rundum schlechte Benutzererfahrung.
Betrachten Sie die meisten Betriebssysteme. Wenn Sie versuchen, eine Datei zu lesen, auf die Sie nicht zugreifen dürfen, wird kein Anmeldebildschirm angezeigt.
Zum Glück wurden die HTTP-Spezifikationen aktualisiert (Juni 2014), um die Mehrdeutigkeit zu beseitigen.
Aus "Hyper Text Transport Protocol (HTTP / 1.1): Authentifizierung" (RFC 7235):
Der Statuscode 401 (nicht autorisiert) gibt an, dass die Anforderung nicht angewendet wurde, da keine gültigen Authentifizierungsdaten für die Zielressource vorhanden sind.
Aus "Hypertext Transfer Protocol (HTTP / 1.1): Semantik und Inhalt" (RFC 7231):
Der Statuscode 403 (Verboten) zeigt an, dass der Server die Anforderung verstanden hat, sich jedoch weigert, sie zu autorisieren.
Interessanterweise war das Verhalten von AuthorizeAttribute zum Zeitpunkt der Veröffentlichung von ASP.NET MVC 1 korrekt. Jetzt ist das Verhalten falsch - die HTTP / 1.1-Spezifikation wurde behoben.
Anstatt zu versuchen, die Weiterleitungen der Anmeldeseite von ASP.NET zu ändern, ist es einfacher, das Problem nur an der Quelle zu beheben. Sie können ein neues Attribut mit demselben Namen ( AuthorizeAttribute
) im Standard-Namespace Ihrer Website erstellen (dies ist sehr wichtig). Der Compiler übernimmt es dann automatisch anstelle des Standard- Attributs von MVC. Natürlich können Sie dem Attribut jederzeit einen neuen Namen geben, wenn Sie diesen Ansatz bevorzugen.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}