C# 在所有登录过程之后,我如何获得外部身份?

C# 在所有登录过程之后,我如何获得外部身份?,c#,asp.net-mvc,C#,Asp.net Mvc,我正在使用MVC5,我可以使用Google成功登录 我想在登录过程后访问用户的外部身份声明。例如,我希望在视图中访问来自用户的声明“图片”。但是,如果我尝试运行此代码,它总是返回null。(登录过程中除外-mvc模板的自动生成代码) 我是否有办法访问外部身份声明?(登录过程后)您需要存储身份验证令牌,然后使用该令牌查询登录提供商的API以获取所需信息。存储它非常简单: Startup.Auth.cs const string XmlSchemaString = "http://www.w3.o

我正在使用MVC5,我可以使用Google成功登录

我想在登录过程后访问用户的外部身份声明。例如,我希望在视图中访问来自用户的声明“图片”。但是,如果我尝试运行此代码,它总是返回null。(登录过程中除外-mvc模板的自动生成代码)


我是否有办法访问外部身份声明?(登录过程后)

您需要存储身份验证令牌,然后使用该令牌查询登录提供商的API以获取所需信息。存储它非常简单:

Startup.Auth.cs

const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";

...

var googlePlusOptions = new GoogleOAuth2AuthenticationOptions
{
    ClientId = "yourclientid",
    ClientSecret = "yourclientsecret",
    Provider = new GoogleOAuth2AuthenticationProvider
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:googleplus:access_token", context.AccessToken, XmlSchemaString, "Google"));
            return Task.FromResult(0);
        }
    }
};
app.UseGoogleAuthentication(googlePlusOptions);
然后,在
ExternalLoginCallback
ExternalLoginConfirm
中创建新用户后:

await SaveAccessToken(user, identity);
使用以下对
SaveAccessToken
的定义(只需将其与控制器中的其他助手方法放在一起):


现在,您可以随时使用访问令牌。因此,对于谷歌来说,要获得个人资料照片,您只需向
https://www.googleapis.com/oauth2/v3/userinfo?access_token=[token]
,其中
[token]
是您保存的声明的值。

我找到了标识的创建方式。基本上,
ExternalSignInAsync
SignInAsync
进行内部调用,调用
createuseridentitysync

我在
IdentityConfig
文件中找到了一个类
ApplicationSigningManager
,然后我将
CreateUserIdentityAsync
方法更改为:

public override async Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
    var externalIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

    var localIdentity = await user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);

    foreach (var item in externalIdentity.Claims)
    {
        if (!localIdentity.HasClaim(o => o.Type == item.Type))
            localIdentity.AddClaim(item);
    }

    return localIdentity;
}

AuthenticationManager
=
HttpContext.GetOwinContext().Authentication
ExternalLoginCallback
期间,
AuthenticationManager.User
尚未包含本地标识。。。如何让用户向其添加声明
var user=wait UserManager.FindAsync(loginInfo.Login).WithCurrentCulture()但我不认为它是优化的。
public override async Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
{
    var externalIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

    var localIdentity = await user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);

    foreach (var item in externalIdentity.Claims)
    {
        if (!localIdentity.HasClaim(o => o.Type == item.Type))
            localIdentity.AddClaim(item);
    }

    return localIdentity;
}
@HttpContext.Current.GetOwinContext()
    .Authentication.User.FindFirst("urn:google:picture").Value