我在MVC5中使用Aspnet標識。 Facebook是一個外部登錄。我需要存儲Facebook訪問令牌供以後使用。我已看過一些話題吧,但我仍然有一些問題: 我設置的是這樣的:在MVC5中使用Facebook訪問令牌聲明與Aspnet標識
當Facebook的配置認證,我添加了一些要求對Facebook的訪問令牌:
OnAuthenticated = async context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); ... }
當外部登錄完成,它帶來的要求與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; ....... } }
的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成功後向當前標識添加自定義聲明?