Meine WebAPI 2-Anwendung verfügt über einen benutzerdefinierten Autorisierungsfilter, der nach einem Zugriffstoken sucht. Wenn das Token vorhanden ist und die API das Attribut besitzt, überprüfe ich, ob ein Benutzer existiert, der diesem Token zugeordnet ist.Festlegen des Prinzipal-/Benutzerkontexts für ein Benutzerobjekt
Aufgrund der Art der API werden die meisten Methoden im Kontext eines bestimmten Benutzers ausgeführt (d. H. "POST api/profile" zum Aktualisieren eines Benutzerprofils). Um dies zu tun, brauche ich Informationen über den Zielbenutzer, die ich vom Zugriffstoken bekomme.
[aktuelle Implementierung, geschieht innerhalb Attribute 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, um dann die Zugriffstoken zu verwenden, um eine zweite Suche in der Methode zu tun. Da ich aber zur Auth-Zeit schon einen Lookup mache, möchte ich keinen weiteren DB-Call verschwenden.
[Was ich tun möchte (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;
}
Ich weiß nicht, warum ich nicht über die Erweiterung der GenericPrincipal - es dachte hat gut funktioniert! Vielen Dank! – ShaneC