Set AUFTRAGGEBER/Benutzer-Kontext zu einem Objekt
Meinen WebAPI 2 Anwendung eine benutzerdefinierte Autorisierungs-filter, welche Prüfungen für einen access-token. Wenn das token vorhanden ist, und die API hat das Attribut, dann kann ich überprüfen, ob es existiert ein Benutzer die Karten an das token an.
Aufgrund der Natur der API, die meisten Methoden laufen im Kontext eines bestimmten Benutzers (z.B. "POST-api/Profil" zu aktualisieren, das Profil eines Benutzers). Um dies zu tun, benötige ich Informationen über die Zielgruppe, die ich aus der access-token.
[Aktuelle Implementierung, geschieht im Attribut vom Typ AuthorizeAttribute]
if( myDBContext.MyUsers.Count( x => x.TheAccessToken == clientProvidedToken ) ){
IPrincipal principal = new GenericPrincipal( new GenericIdentity( myAccessToken ), new string[] { "myRole" } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
return true;
}
Dies funktioniert gut, und ich bin in der Lage, verwenden Sie dann den access token für eine zweite Suche in der Methode. Da ich aber bereits ein lookup auf auth-Zeit möchte ich nicht verschwenden eine andere DB aufrufen.
[Was ich gerne tun würde (aber offensichtlich nicht funktioniert)]
MyUser user = myDBContext.MyUsers.FirstOrDefault( x => x.TheAccessToken == clientProvidedToken );
if( user != null ){
//Set *SOME* property to the User object, such that it can be
//access in the body of my controller method
//(e.g. /api/profile uses this object to load data)
HttpContext.Current.User = user;
return true;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie Ihre eigenen principal-Klasse. Vielleicht so etwas wie:
Dann Ihre Aktion filter tun könnte:
Und anschließend in Ihre tatsächliche Methode, die Sie ergreifen können, den aktuellen Benutzer, prüfen, ob es der Typ
MyPrincipal
und wenn so gegossen und anschließend auf die UserDetails:Habe ich nicht actaully versuchte diesen code, so könnte es sein, Tippfehler...
Könnte man eine
ClaimsIdentity/ClaimsPrincipal
und fügen Sie denClaims
Sie später brauchen in Ihrem controller, zum Beispiel die Darsteller-ID oder andere Werte, die Sie brauchen.Ich habe ein Beispiel, das stellt Ansprüche an die Schauspieler, aber wenn es besser zu Ihnen passt, könnte man auch an Forderungen direkt an den aktuellen Benutzer.