2017-10-30 6 views
0

Ich habe ein MVC-Projekt mit verwendet Identität. Dies ermöglicht Benutzern, sich bei der Site anzumelden und ein Profil zu erstellen.Zugriff Benutzername von der Standardauthentifizierung

Ich habe eine separate WebAPI-Klasse, damit Embedded-GSM-Geräte mit dem Server kommunizieren können. Benutzer können sich anmelden und viele GSM-Einheiten zu ihrem Profil hinzufügen. Ich musste einen grundlegenden Authentifizierungsfilter für die eingebetteten GSM-Geräte verwenden, da sie kein Token/Cookie cachen können.

Meine Frage ist, wie suche ich den Benutzernamen der Anfrage in einem WebAPI-Controller? Ich habe versucht, auf den Benutzer mit RequestContext.Principal wie Vorschläge zuzugreifen, aber es gibt null zurück.

Controller:

[BasicAuthentication] 
public void Post([FromBody]string value) 
{ 
    // Get username from request for database lookup? 
} 

Filter:

public class BasicAuthenticationAttribute : AuthorizationFilterAttribute 
{ 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext.Request.Headers.Authorization == null) 
     { 
      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
     } 
     else 
     { 
      string authenticationToken = actionContext.Request.Headers.Authorization.Parameter; 
      string decodedAuthenticationToken = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationToken)); 
      string[] usernamePasswordArray = decodedAuthenticationToken.Split(':'); 
      string username = usernamePasswordArray[0]; 
      string password = usernamePasswordArray[1]; 

      if (GSMSecurity.Login(username, password)) 
      { 
       Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(username), null); 
      } 
      else 
      { 
       actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
      } 
     } 
    } 
} 

Edit:

ich den Benutzernamen unter Verwendung gefunden:

System.Threading.Thread.CurrentPrincipal;

+0

RequestContext.Principal.Identity.Name –

Antwort

1

finden Wenn Ihr Controller von System.Web.Http.ApiController erbt Sie die User Eigenschaft zugreifen:

[BasicAuthentication] 
public void Post([FromBody]string value) 
{ 
    var name = User.Identity.Name; 
} 

In BasicAuthentication, vergessen Sie nicht die Haupteigenschaft auf richtig eingestellt, wenn Anmelden:

if (GSMSecurity.Login(username, password)) 
{ 
    var currentPrincipal = new GenericPrincipal(new GenericIdentity(username), null); 
    actionContext.RequestContext.Principal = currentPrincipal; 
    Thread.CurrentPrincipal = currentPrincipal; 
    HttpContext.Current.User = currentPrincipal; 
} 
+0

Ich bekomme einen Nullwert, wenn ich dies versuche, habe ich weitere Informationen hinzugefügt. –

+0

Aktualisiert das Beispiel – peco

+0

Vielen Dank, ich füge das oben hinzu –

0

Sie können den aktuellen Benutzer in der RequestContext.Principal

0

Sie sollten auch überlegen, das Prinzip festzulegen al auf der Httpcontext

if (GSMSecurity.Login(username, password)) { 
    var principal = new GenericPrincipal(new GenericIdentity(username), null); 
    System.Threading.Thread.CurrentPrincipal = principal; 
    if (System.Web.HttpContext.Current != null) { 
     System.Web.HttpContext.Current.User = principal; 
    } 
} 

Und dann über die User Eigenschaft auf dem zugreifenden ApiController

[BasicAuthentication] 
public void Post([FromBody]string value) { 
    // Get username from request for database lookup? 
    var username = User.Identity.Name; 
    //... 
} 

Der Rahmen wird die Benutzerinformationen aus dem Kontext extrahiert und mit dem Anforderungskontext zuordnen.

Verwandte Themen