2014-07-09 4 views
5

Ich arbeite an einer einseitigen Anwendung mit AngularJS und ASP.NET Identity 2. Ich logge den Benutzer ein und der Cookie wird gesetzt; Wenn ich jedoch die Identität des Benutzers auf der gleichen Anfrage überprüfe, zeigt es es als leer und IsAuthenticated ist falsch. Diese werden jedoch bei nachfolgenden Anforderungen ausgefüllt. Ich hatte gehofft, zurück zur Benutzerschnittstelle zu senden, ob der Benutzer auf der gleichen Anfrage eingeloggt war oder nicht. Ist das möglich?ASP.NET Identity aktualisiert keine Identitätsinformationen auf derselben Anfrage

-Code wie gewünscht (AngularJS macht AJAX Post in WebAPI Controller Login-Methode)

[HttpPost] 
[AllowAnonymous] 
[Route("Login")] 
public async Task<IHttpActionResult> Login(LoginModel loginModel) 
{ 
    var result = await _securityService.Login(loginModel.UserName, loginModel.Password); 
    if (!result) 
    { 
     ModelState.AddModelError("errorMessage", "Invalid username or password."); 
     return BadRequest(ModelState); 
    } 
    return Ok(); 
} 

public async Task<bool> Login(string userName, string password, bool persistCookie = false) 
{ 
    var user = await _userManager.FindAsync(userName, password); 
    if (user != null) 
     await SignInAsync(user, persistCookie); 
    else 
     return false; 

    return true; 
} 

private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
{ 
    _authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
    _authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, await CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie)); 
} 

public Task<ClaimsIdentity> CreateIdentity(ApplicationUser user, string authenticationType) 
{ 
    return _userManager.CreateIdentityAsync(user, authenticationType); 
} 
+1

-Code hilfreich sein würde. – Stilgar

+0

Code hinzugefügt, hoffe es hilft! BTW, obwohl ich AuthenticationMode.Active einstellen könnte in irgendeiner Form helfen, aber das hat nicht geholfen! – Todd

+0

Wenn ich dieses Recht verstehe, ist die Identitätsinformation leer, es sei denn, die Anfrage enthält ein Cookie (oder Token). Aber ich würde erwarten, dass dies vom Authentifizierungsmanager bei der Anmeldung festgelegt wird? Vielleicht ist das unmöglich? – Todd

Antwort

5

Sie werden nicht in der Identität, bis die nächste Anforderung unterzeichnet erhalten, weil der Anruf an SignIn ist, was ein Cookie verursacht zu sein setze auf die Antwort. Dieser Cookie wird bei nachfolgenden Anfragen zur Identität, aber es ist zu spät, um die Identität Ihrer aktuellen Anfrage zu ändern.

0

Ich logge den Benutzer ein und der Cookie ist gesetzt; Wenn ich jedoch die Identität des Benutzers auf der gleichen Anfrage überprüfe, zeigt es es als leer und IsAuthenticated ist falsch.

This is just a lack of knowledge on your part about how the ASP.Net pipeline works.

Es gibt eine ziemlich große Pipeline von Ereignissen, die auftreten. Ich bin mir ziemlich sicher, dass MVC in der ProcessRequest Methode läuft. Diese Methode ist nach dem AuthenticateRequest Ereignis und dem PostAuthenticateRequest Ereignis. Dies bedeutet, dass die gesamte ASP.Net-Authentifizierung Framework nie während der ProcessRequest-Methode aktualisiert werden kann. Dies ist der Grund, warum fast alle Systeme eine Weiterleitung durchführen, so dass die nächste Anfrage die gesamte Authentifizierung hat (IIdentity, IPrincipal, IsAuthenticated, usw.).

Ich hatte gehofft, zurück zur Benutzeroberfläche zu senden, ob der Benutzer auf der gleichen Anfrage angemeldet war oder nicht. Ist das möglich?

Wie konnte der Code nicht in der Lage sein? Die erste Anfrage authentifiziert sie entweder oder nicht, welcher Code auch immer tut, weiß, ob sie authentifiziert sind.

+0

Redirects werden aus ganz anderen Gründen ausgeführt. Zum Beispiel, weil die Login-Seite nur als Login-Seite dient oder weil sie die erneute Übermittlung der Daten auf F5 vermeiden wollen – Stilgar

+0

fehlt mir wahrscheinlich das Wissen, und ich verwende MVC (WebAPI) nicht, also was ich vorher in meinem Kommentar gesagt hatte war richtig. Danke für Ihre Referenz. Nicht sicher, was du meinst, wie könnte der Code nicht? Ja, der Benutzer wird authentifiziert, aber wie bereits erwähnt, wird der Cookie immer noch in dieser Antwort gesetzt, so dass eine nachfolgende Anfrage die Identität als authentifiziert hätte. – Todd

2

Wenn Owin-Authentifizierung verwenden, sendet das AuthenticationManager.SignIn() Verfahren kaum eine Nachricht an den Cookie-Handler ein Cookie zu setzen, wenn der Cookie-Handler die Anfrage nach dem Web-API-Controller (siehe mein Blog-Post Understanding the Owin External Authentication Pipeline für weitere Details) zu handhaben wird.

Aber die Login Methode gibt true wenn die Anmeldung erfolgreich war und false wenn nicht, so dass Sie diese Informationen in der Login Aktion verwenden können Informationen zurück zu senden. Wenn Sie nicht nur wissen möchten, ob die Anmeldung erfolgreich war oder nicht, sondern auch die tatsächliche Identität, können Sie Login() ändern, um den Benutzer bei erfolgreicher Anmeldung und null zurückzugeben, falls er fehlgeschlagen ist.

0

Ich hatte gehofft, zurück zur Benutzeroberfläche zu senden, ob der Benutzer auf der gleichen Anfrage angemeldet war oder nicht. Ist das möglich?

Ja. Wie in anderen Antworten gesagt, können Sie.

Ich möchte nur den Fall abdecken, wenn Sie in der gleichen Anfrage sind, aber außerhalb des Kontexts, in dem das SignIn stattfand.

Durch Owin, könnten Sie so etwas wie diese Erweiterung Methode:

/// <summary> 
    /// Check if the user was authenticated in the current request, or in a previous one 
    /// </summary> 
    public static bool IsUserAuthenticated(this IOwinContext context) 
    { 
     if (context.Request.User.Identity.IsAuthenticated) 
      return true; 

     if (null != context.Authentication.AuthenticationResponseGrant && null != context.Authentication.AuthenticationResponseGrant.Identity) 
     { 
      return context.Authentication.AuthenticationResponseGrant.Identity.IsAuthenticated; 
     } 

     return false; 
    } 
Verwandte Themen