2013-10-13 154 views
18

將實體框架6.0.0-rc1(Visual Studio 2013 RC附帶的)與asp.net身份版本1.0.0-rc1一起使用。如何使用asp.net身份更改當前用戶的用戶名後更改身份驗證Cookie

試圖讓用戶有機會改變他們的UserName。 似乎沒有AuthenticationIdentityManager下的功能,所以我使用EF更改數據(獲取當前用戶的用戶對象,更改用戶名和保存更改)。

問題是身份驗證Cookie保持不變,並且下一個請求失敗,因爲沒有這樣的用戶。

在過去的表單驗證我使用下面的代碼來解決這個問題。

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

如何使用asp.net身份更新cookie?

UPDATE

下面的代碼似乎更新身份驗證Cookie。

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}); 

剩下的問題是:如何提取當前驗證cookie IsPersistent價值?

回答

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); 
} 

對於RC1,您可以使用類似的代碼。

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

對於永久值,您需要訪問身份驗證cookie並檢索狀態。

更新:

使用適當的AuthenticationType代替「承載」。同時請確保在發佈登錄票證時,您正在設置AuthenticationProperties.IsPersistent。

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

此代碼可能適用於RTM(尚未廣泛使用)。在RC1中沒有DefaultAuthenticationTypes和UserManager.CreateIdentityAsync()。 – aleyush

+0

第二個問題:我如何獲取當前的IsPersistent值(我的目標只是更改UserName,而不是其他任何內容)? – aleyush

+0

在發佈VS2013之前,最好在每晚構建中進行試驗。很少有開發人員發表的評論指出,許多RC1類在RTM中不可用,它將在11月份與VS2013一起發佈。 – jd4u