2013-10-13 8 views
18

Verwenden von asp.net identity Version 1.0.0-rc1 mit Entity Framework 6.0.0-rc1 (die mit Visual Studio 2013 RC gelieferten).So ändern Sie die Authentifizierungscookies, nachdem Sie Benutzernamen des aktuellen Benutzers mit asp.net identity geändert haben

Versuchen Benutzern die Möglichkeit zu geben, ihre UserName zu ändern. Es scheint keine Funktion für das unter AuthenticationIdentityManager, also ändere ich die Daten mit EF (Benutzerobjekt für den aktuellen Benutzer abrufen, Benutzernamen ändern und Änderungen speichern).

Das Problem besteht darin, dass Authentifizierungscookies unverändert bleiben und die nächste Anfrage fehlschlägt, da es keinen solchen Benutzer gibt.

Mit Formularauthentifizierung in der Vergangenheit habe ich den folgenden Code verwendet, um dies zu lösen.

var formsAuthCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
var isPersistent = FormsAuthentication.Decrypt(formsAuthCookie.Value).IsPersistent; 
FormsAuthentication.SetAuthCookie(newUserName, isPersistent); 

Was soll ich mit ASP.net-Identität tun, um die Cookies zu aktualisieren?

UPDATE

Der folgende Code scheint das Authentifizierungscookie zu aktualisieren.

var identity = new ClaimsIdentity(User.Identity); 
identity.RemoveClaim(identity.FindFirst(identity.NameClaimType)); 
identity.AddClaim(new Claim(identity.NameClaimType, newUserName)); 
AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant 
    (new ClaimsPrincipal(identity), new AuthenticationProperties {IsPersistent = false}); 

Das verbleibende Problem ist: wie Wert aus aktuellen Authentifizierung Cookie extrahieren?

Antwort

15

How do you login/authenticate a user with Asp.Net MVC5 RTM bits using AspNet.Identity?

private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
{ 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
} 

Für die RC1 können Sie einen ähnlichen Code verwenden.

AuthenticationManager.SignOut(); 
IdentityManager.Authentication.SignIn(AuthenticationManager, user.UserId, isPersistent:false); 

Für einen dauerhaften Wert müssen Sie auf den Authentifizierungscookie zugreifen und den Status abrufen.

Aktualisiert:

Verwenden Sie geeignete AuthenticationType anstelle von "Bearer" verwendet. Stellen Sie außerdem sicher, dass Sie beim Ausstellen des Anmeldetickets die AuthenticationProperties.IsPersistent festlegen.

bool isPersistent=false; 
var authContext = await Authentication.AuthenticateAsync("Bearer"); 
if (authContext != null) 
{ 
    var aProperties = authContext.Properties; 
    isPersistent = aProperties.IsPersistent; 
} 
+0

Dieser Code funktioniert möglicherweise für RTM (noch nicht weit verbreitet). In RC1 gibt es keine DefaultAuthenticationTypes und UserManager.CreateIdentityAsync(). – aleyush

+0

Die zweite Frage: Wie kann ich den aktuellen IsPersistent-Wert erhalten (mein Ziel ist es, nur UserName zu ändern, sonst nichts)? – aleyush

+0

Vor der Veröffentlichung von VS2013 ist es gut, Versuche mit dem nächtlichen Build zu halten. Einige der Kommentare hier von Entwicklern gibt an, dass die vielen RC1-Klassen in RTM nicht verfügbar sind, die mit VS2013 im Nov. – jd4u

Verwandte Themen