OWIN - 在后续请求中访问外部声明

时间:2015-11-17 15:26:12

标签: c# asp.net oauth oauth-2.0 owin

我有一个ASP.Net应用程序,它通过第三方提供商使用OWIN和外部登录,特别是谷歌。

在身份验证期间,此代码用于从OwinContext

中提取ClaimsIdentity
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

其中AuthenticationManager是

    private IAuthenticationManager AuthenticationManager
    {
        get
        {
            return HttpContext.GetOwinContext().Authentication;
        }
    }

但是,在后续请求中(即成功登录后重定向到主页),GetExternalLoginInfoAsync()返回null。我想要做的是访问有关外部提供程序从我的身份验证请求返回的用户帐户(即个人资料图片)的信息。如何从MVC控制器或Web API控制器访问这些声明?

我所拥有的几乎所有代码都是Visual Studio样板代码,因此我不会在此处包含它,但如果需要任何特定内容,我可以添加一些代码。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

我试图使用外部登录信息来提取图片和个人资料网址等数据。执行此操作的正确方法是将外部源的声明分配给本地标识,如下所示:

  public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, string> manager, IAuthenticationManager authentication = null)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here

        if (authentication != null)
        {
            ExternalLoginInfo info = authentication.GetExternalLoginInfo();

            if (info != null)
                foreach (Claim claim in info.ExternalIdentity.Claims.Where(claim => !userIdentity.HasClaim(c => c.Type == claim.Type)))
                {
                    userIdentity.AddClaim(claim);
                    await manager.AddClaimAsync(userIdentity.GetUserId(), claim);
                }
        }

        return userIdentity;
    }