Ich lese aus verschiedenen Quellen (Bücher und SO-Antworten) über die Autorisierung in WebApi.
Angenommen, ich möchte ein benutzerdefiniertes Attribut hinzufügen, das den Zugriff nur für bestimmte Benutzer ermöglicht:
Fall 1
Ich habe diesen Ansatz des Überschreibens gesehen OnAuthorization
, der die Reaktion festlegt, wenn etwas nicht stimmt
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
Fall 2
Aber ich habe auch dieses ähnliche Beispiel gesehen, das ebenfalls OnAuthorization
außer Kraft gesetzt wurde, aber mit dem Aufruf an base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
Dann prüfen Sie, ob das
HttpActionContext.Response
eingestellt ist oder nicht. Wenn es nicht festgelegt ist, bedeutet dies, dass die Anforderung autorisiert ist und der Benutzer in Ordnung ist
Fall 3
Aber ich habe auch diesen Ansatz des Überschreibens gesehen IsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
Fall 4
Und dann habe ich ein ähnliches Beispiel gesehen, aber mit dem Aufruf von base.IsAuthorized (Kontext):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
Eine Sache noch
Und schließlich sagte Dominick hier :
Sie sollten OnAuthorization nicht überschreiben, da Ihnen die Behandlung mit [AllowAnonymous] fehlen würde.
Fragen
1) Welche Methoden soll ich anwenden:
IsAuthorized
oderOnAuthorization
? (oder wann man welche benutzt)2) Wann soll ich
base.IsAuthorized or
base.OnAuthorization anrufen?3) Haben sie es so gebaut? dass, wenn die Antwort null ist, dann ist alles in Ordnung? (Fall 2)
NB
Bitte beachten Sie, dass ich nur AuthorizeAttribute
das verwende (und verwenden möchte), von dem bereits geerbt wurde AuthorizationFilterAttribute
Warum ?
Weil ich mich in der ersten Phase befinde in: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Wie auch immer, ich frage über die Erweiterung des Authorize-Attributs.
quelle
Antworten:
Sie verlängern,
AuthorizationFilterAttribute
wenn Ihre Berechtigungslogik nicht von der festgelegten Identität und den Rollen abhängt. Für die benutzerbezogene Autorisierung werden Sie erweitern und verwendenAuthorizeAttribute
. Für den ersteren Fall werden Sie überschreibenOnAuthorization
. Im letzteren Fall werden Sie überschreibenIsAuthorized
. Wie Sie dem Quellcode dieser AttributeOnAuthorization
entnehmen können , ist es als virtuell markiert, damit Sie es überschreiben können, wenn Sie von ableitenAuthorizationFilterAttribute
. Andererseits ist dieIsAuthorized
Methode in als virtuell markiertAuthorizeAttribute
. Ich glaube, dies ist ein guter Hinweis auf die beabsichtigte Verwendung.Die Antwort auf diese Frage liegt darin, wie OO im Allgemeinen funktioniert. Wenn Sie eine Methode überschreiben, können Sie entweder eine neue Implementierung vollständig bereitstellen oder auf die vom übergeordneten Element bereitgestellte Implementierung zurückgreifen und das Verhalten verbessern. Nehmen Sie zum Beispiel den Fall von
IsAuthorized(HttpActionContext)
. Das Verhalten der Basisklasse besteht darin, den Benutzer / die Rolle mit den Angaben im Filter und der festgelegten Identität zu vergleichen. Angenommen, Sie möchten all das tun, aber zusätzlich möchten Sie etwas anderes überprüfen, das möglicherweise auf einem Anforderungsheader oder etwas anderem basiert. In diesem Fall können Sie eine solche Überschreibung bereitstellen.Es tut mir leid, aber ich verstehe dein Q3 nicht. Übrigens gibt es den Autorisierungsfilter schon lange und die Leute verwenden ihn für alle möglichen Dinge und manchmal auch falsch.
Der Typ, der das gesagt hat, ist der Gott der Zugangskontrolle - Dominick. Offensichtlich wird es richtig sein. Wenn Sie sich die Implementierung von
OnAuthorization
(unten kopiert) ansehen ,Der Aufruf von
SkipAuthorization
ist der Teil, der sicherstelltAllowAnonymous
, dass Filter angewendet werden, dh die Autorisierung wird übersprungen. Wenn Sie diese Methode überschreiben, verlieren Sie dieses Verhalten. Wenn Sie sich dazu entschließen, Ihre Berechtigung auf Benutzer / Rollen zu stützen, hätten Sie sich zu diesem Zeitpunkt entschieden, davon abzuleitenAuthorizeAttribute
. Die einzig richtige Option, die zu diesem Zeitpunkt für Sie übrig bleibt, ist das ÜberschreibenIsAuthorized
und nicht das bereits überschriebeneOnAuthorization
, obwohl dies technisch möglich ist.PS. In der ASP.NET-Web-API gibt es einen anderen Filter, den Authentifizierungsfilter. Die Idee ist, dass Sie diesen Filter für die Authentifizierung und den Autorisierungsfilter für die Autorisierung verwenden, wie der Name schon sagt. Es gibt jedoch viele Beispiele, bei denen diese Grenze verfälscht ist. Viele Beispiele für Authentifizierungsfilter führen eine Art Authentifizierung durch. Wenn Sie Zeit haben und etwas mehr verstehen möchten, lesen Sie diesen MSDN- Artikel . Haftungsausschluss: Es wurde von mir geschrieben.
quelle
OnAuthorization
in meinem Buch über das Überschreiben geschrieben zu haben. Ich bin sicher, ich hätte nicht darüber geschrieben, die Antwort auf Null zu überprüfen, denn dies ist das erste Mal, dass ich davon höre :)Ok, mein Vorschlag ist, Folgendes zu tun, vorausgesetzt, Sie verwenden OAuth-Inhaber-Token, um Ihre Web-API zu schützen, und Sie legen die erlaubte Zeit als Anspruch für den Benutzer fest, als Sie das Token ausgestellt haben. Weitere Informationen zur tokenbasierten Authentifizierung finden Sie hier
Überschreiben Sie die Methode
OnAuthorizationAsync
und verwenden Sie den folgenden Beispielcode:quelle
AuthorizeAttribute
was erbtAuthorizationFilterAttribute
und -auch zum Lernen. Ich habe speziell gefragt, welche Methode ich verwenden soll und ob die Antwort Inhalt hat oder nicht ...ASP.NET v5 Einführung eines völlig neuen Autorisierungssystems. Für diejenigen, die .NET 5 verwenden möchten, würde ich empfehlen, in Microsoft.AspNet.Authorization zu wechseln.
Ziemlich viel wickelt es die mess up verursacht durch beide zu halten
System.Web.Http.Authorize
undSystem.Web.Mvc.Authorize
auch andere , ältere Authentifizierungsimplementierungen.Es bietet eine sehr gute Abstraktion von Aktionstypen (Erstellen, Lesen, Aktualisieren, Löschen), Ressourcen, Rollen, Ansprüchen, Ansichten und benutzerdefinierten Anforderungen und ermöglicht das Erstellen benutzerdefinierter Handler, wobei eine der oben genannten kombiniert wird. Darüber hinaus können diese Handler auch in Kombination verwendet werden.
quelle