【问题标题】:Using Facebook access token claim with Aspnet Identity in MVC5在 MVC5 中使用带有 Aspnet Identity 的 Facebook 访问令牌声明
【发布时间】:2015-11-27 09:33:43
【问题描述】:

我在 MVC5 中使用 Aspnet Identity。 Facebook 是外部登录。我需要存储 Facebook 访问令牌以备后用。我已经阅读了几个关于它的主题,但我仍然有一些问题: 我是这样设置的:

  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 访问令牌的声明保存到数据库: 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


    【解决方案1】:

    我已阅读this answer,我可以在登录成功后立即添加声明:

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

    但不确定此代码在某些情况下是否存在问题。

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 2021-10-01
      • 1970-01-01
      • 2016-02-28
      • 2018-02-21
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多