wake-up-neo.com

Ruft den aktuellen Benutzer in einer ApiController-Aktion ab, ohne die Benutzer-ID als Parameter zu übergeben

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.

87
Shaun Luttin

In WebApi 2 können Sie RequestContext.Principal aus einer Methode auf ApiController

135
Darrel Miller

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();
35
Patrick

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

14
Karan Bhandari

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)).

6
kannankeril

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;
5
Jeff Leach

In .Net Core verwenden Sie User.Identity.Name, um den Namensanspruch des Benutzers zu erhalten.

4

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. :)

3
pampi
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:

Zugriff auf HTTPContext über Ihre Web-API-Aktion

1
Shaun Luttin