2015-11-27 40 views
1

我在MVC5中使用Aspnet標識。 Facebook是一個外部登錄。我需要存儲Facebook訪問令牌供以後使用。我已看過一些話題吧,但我仍然有一些問題: 我設置的是這樣的:在MVC5中使用Facebook訪問令牌聲明與Aspnet標識

  1. 當Facebook的配置認證,我添加了一些要求對Facebook的訪問令牌: OnAuthenticated = async context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); ... }

  2. 當外部登錄完成,它帶來的要求與Facebook令牌: public async Task ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); //The loginInfo object contains the claim i needed (the facebook token) var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: //find user and save the claim to database. var u = UserManager.Find(loginInfo.Login); await SaveAccessToken(u, loginInfo.ExternalIdentity); return RedirectToLocal(returnUrl); break; ....... } }

  3. 的SaveAccessToken方法只是調用UserManager.AddClaimAsync保存要求包含Facebook的一個CCESS令牌數據庫: private async Task SaveAccessToken(ApplicationUser user, ClaimsIdentity identity) { var userclaims = await UserManager.GetClaimsAsync(user.Id); foreach (var at in (from claims in identity.Claims where claims.Type.Equals("FacebookAccessToken") select new Claim(claims.Type, claims.Value, claims.ValueType, claims.Issuer)).Where(at => !userclaims.Contains((Claim) at))) { await UserManager.AddClaimAsync(user.Id, at); } }

令牌被成功保存到數據庫中的表AspnetUserClaims。但是,登錄完成後,站點重定向到其他操作,User對象具有「ApplicationCookie」類型的標識,並且沒有任何名爲「FacebookAccessToken」的聲明。有幾個主題說我必須在通過重寫UserManager類的CreateIdentityAsync方法創建身份對象時添加自定義聲明。像這樣:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public async override Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser applicationUser, string authenticationType) 
    { 
     var identity = await base.CreateIdentityAsync(applicationUser, authenticationType); 

     identity.AddClaim(new Claim("mycustomclaim", applicationUser.Avatar)); 
     return identity; 
    } 
} 

但是,正如我注意到的,身份是在ExternalSignInAsync執行時創建的。因此,內部方法CreateIdentityAsync,我如何獲得從ExternalSignInAsync傳遞的loginInfo對象的聲明值。如果我不能,有什麼辦法,我可以在ExternalSignInAsync成功後向當前標識添加自定義聲明?

回答

1

我已閱讀this answer,我可以登錄成功後立即加入要求:

SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.AddClaim(new Claim("FacebookAccessToken", loginInfo.ExternalIdentity.Claims.First(c => c.Type.Equals("FacebookAccessToken")).Value));

,但不知道該代碼有在某些情況下的問題。