Wie erhält man den aktuellen Benutzer innerhalb einer sicheren ApiController-Aktion, ohne den Benutzernamen oder die Benutzer-ID als Parameter zu übergeben?
Wir gehen davon aus, dass dies verfügbar ist, da wir uns in einer sicheren Aktion befinden. In einer sicheren Aktion zu sein bedeutet, dass sich der Benutzer bereits authentifiziert hat und die Anfrage ihren Inhaber-Token hat. Angesichts der Tatsache, dass WebApi den Benutzer autorisiert hat, gibt es möglicherweise eine integrierte Möglichkeit, auf die Benutzer-ID zuzugreifen, ohne sie als Aktionsparameter übergeben zu müssen.
In WebApi 2 können Sie RequestContext.Principal
aus einer Methode auf ApiController
Sie können auf den Principal auch zugreifen, indem Sie die Eigenschaft User
für ApiController
verwenden.
Die folgenden beiden Aussagen sind also grundsätzlich gleich:
string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();
Hinweis liegt in Webapi2 automatisch generierten Kontocontroller
Haben Sie diese Eigenschaft mit Getter definiert als
public string UserIdentity
{
get
{
var user = UserManager.FindByName(User.Identity.Name);
return user;//user.Email
}
}
und um UserManager zu bekommen - In WebApi2 -do als Römer (gelesen als AccountController)
public ApplicationUserManager UserManager
{
get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
Dies sollte im IIS und im Self-Host-Modus kompatibel sein
Keiner der obigen Vorschläge hat für mich funktioniert. Folgendes hat getan!
HttpContext.Current.Request.LogonUserIdentity.Name
Ich denke, es gibt eine Vielzahl von Szenarien und diese hat für mich funktioniert. Mein Szenario umfasste ein AngularJS-Frontend und eine Web-API-2-Backend-Anwendung, die beide unter IIS ausgeführt wurden. Ich musste beide Anwendungen einstellen, um ausschließlich unter Windows-Authentifizierung auszuführen.
Es müssen keine Benutzerinformationen weitergegeben werden. Der Browser und IIS tauschen die angemeldeten Benutzeranmeldeinformationen aus, und die Web-API hat bei Bedarf Zugriff auf die Benutzeranmeldeinformationen (von IIS= Ich nehme an)).
Karan Bhandaris Antwort ist gut, aber der in einem Projekt hinzugefügte AccountController ist sehr wahrscheinlich ein Mvc.Controller
. Um seine Antwort für die Verwendung in einem ApiController zu konvertieren, ändern Sie HttpContext.Current.GetOwinContext()
in Request.GetOwinContext()
und stellen Sie sicher, dass Sie die folgenden 2 using
Anweisungen hinzugefügt haben:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
In .Net Core verwenden Sie User.Identity.Name
, um den Namensanspruch des Benutzers zu erhalten.
Wenn Sie Asp.Identity UseManager verwenden, wird der Wert von automatisch festgelegt
RequestContext.Principal.Identity.GetUserId ()
basierend auf IdentityUser , den Sie zum Erstellen des IdentityDbContext verwenden.
Wenn Sie jemals eine benutzerdefinierte Benutzertabelle und eine Owin-Token-Inhaber-Authentifizierung implementieren, überprüfen Sie bitte meine Antwort.
Wie bekomme ich den Benutzerkontext bei Web-API-Aufrufen?
Hoffe es hilft immer noch. :)
string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null
&& HttpContext.Current.User.Identity.Name != null)
{
userName = HttpContext.Current.User.Identity.Name;
userId = HttpContext.Current.User.Identity.GetUserId();
}
Oder verwenden Sie diese Option basierend auf Darrel Millers Kommentar, um zuerst den HttpContext abzurufen.
// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);
Siehe auch: