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