Autorisieren eines Benutzers je nach den Namen der Aktion
Ich habe viele Controller mit vielen Aktionen. Jede Aktion hat eine eigene Rolle ( Role name = ControllerName.actionName ).
In früheren Versionen die ich testen konnte, ob der aktuelle Benutzer kann der Zugang auf eine Aktion oder ein nicht mit einer "generischen" AuthorizeAttribute :
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
string currentAction = actionContext.ActionDescriptor.ActionName;
string currentController = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
Roles = (currentController + "." + currentAction).ToLower();
base.OnAuthorization(actionContext);
}
Mit der version asp.net 5, ich habe festgestellt, dass ich die Anforderungen ( Wie erstellen Sie eine benutzerdefinierte AuthorizeAttribute in ASP.NET Core? ). Das problem ist, dass die AuthorizationContext nicht geben uns die Informationen über die Aktion, die der Benutzer versucht, zu erreichen.
Ich will nicht zu setzen, eine Autorisierung Attribut für jede Aktion gibt es eine Möglichkeit zu erreichen, meine Anforderung an den neuen Rahmen ? ( Ich bevorzuge es, zu vermeiden, mit HttpContext.Aktuelle, es passt nicht gut in einer pipeline-Architektur )
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der Allgemeine Prozess für die Durchsetzung benutzerdefinierte Authentifizierung. Ihre situation kann in der Lage sein, um vollständig gelöst in Schritt eins, da könnte man hinzufügen, ein Anspruch für die Rolle, schmückt Ihr
1. authentifizieren durch die Schaffung einer Identität für den Benutzer
Schreiben middleware und einfügen in die pipeline über
IApplicationBuilder.UseMiddleware<>
ist, wie benutzerdefinierte Authentifizierung erfolgt. Dies ist, wo wir extrahieren was Informationen können später erforderlich, für die Genehmigung, und legen Sie es in eineClaimsIdentity
. Wir haben eineHttpContext
hier, so dass wir ergreifen können, Infos aus dem header, cookies, angeforderte Pfad, etc. Hier ist ein Beispiel:Nutzen diese middleware fügen Sie diese in
Startup.Configure
vor dem routing:app.UseMyAuthAuthentication();
2. autorisieren durch das erzwingen von Anforderungen an die Identität
Erstellten wir eine Identität für den Benutzer, aber wir müssen noch durchgesetzt werden. Um dies zu tun müssen wir schreiben eine
AuthorizationHandler
wie diese:3. fügen Sie die Anforderung handler als Berechtigungs-policy
Unsere Anforderung Authentifizierung muss noch Hinzugefügt werden, um die
Startup.ConfigureServices
so dass es verwendet werden kann:4. verwenden Sie die Autorisierungsrichtlinie
Der Letzte Schritt ist die Durchsetzung dieser Forderung für bestimmte Aktionen, die durch die Dekoration unserer Aktion oder controller mit
[Authorize("MyAuth")]
. Wenn wir haben viele Controller, die jeweils mit vielen Maßnahmen, die erforderlich Durchsetzung, dann werden wir das machen wollen, eine Basis-Klasse und nur schmücken Sie, dass einzelne controller.Ihre einfachere situation:
Wenn Sie bereits alle Ihre Aktionen, fein abgestimmt mit
[Authorize(Roles = "controllername.actionname")]
dann müssen Sie vermutlich nur Teil #1 oben. Fügen Sie einfach einen neuenClaim(ClaimTypes.Role, "controllername.actionname")
gültig ist, für die jeweilige Anfrage.AuthenticationMiddleware
undAuthenticationHandler
im asp.net Sicherheits-repo.Context.User
seitBaseInitializeAsync
führt die wichtigsten wir bieten. Auch entledigte sich der async/await-da es keine Vorteile hier.Task<AuthenticateResult>
, nichtTask<AuthenticationTicket>
. Also für auth fehlgeschlagen Sie konnten zurückTask.FromResult(AuthenticateResult.Skip())
, und für den Erfolg, den Sie zurückkehren konntenTask.FromResult(AuthenticateResult.Success(ticket))
.HandleAuthenticateAsync
- Sie können nicht auf der aktuell aufgerufenen controller-Namen, weil MVC (scheinbar) noch nicht gelöst. Fähigkeit zu wissen, die Namen an dieser Stelle würde es erlauben, effizienter Ansprüche Abruf aus der Datenbank beim erstellenClaimsIdentity
- wenn wir wissen, dass die angeforderte Ressource durch einige Schlüssel, können wir verlangen, dass die Datenbank für die bestimmte Ressource Berechtigungen nur und nicht alle möglichen Berechtigungen für diesen Benutzer. Die Optimierung könnte nützlich sein, wenn Sie Ihre web-app nicht Zustand (session) zum Zwischenspeichern von Berechtigungen und lädt Sie auf jede Anfrage.