【发布时间】:2015-11-27 09:33:43
【问题描述】:
我在 MVC5 中使用 Aspnet Identity。 Facebook 是外部登录。我需要存储 Facebook 访问令牌以备后用。我已经阅读了几个关于它的主题,但我仍然有一些问题: 我是这样设置的:
为 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 访问令牌的声明保存到数据库:
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 表中。但是,登录完成后,站点重定向到其他操作,用户对象具有“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 成功后向当前身份添加自定义声明?
【问题讨论】:
标签: asp.net-mvc facebook authentication asp.net-identity