我仍然试图将每个拼图与Identity 2.0相关联,我现在的问题是从正确返回的声明中检索用户全名的正确位置是什么每个提供者。
例如,在AccountController.cs
使用此内容的那一刻:
info.ExternalIdentity.Claims
如果我使用Facebook登录,则声明类型为" urn:facebook:name"但是如果我使用我的Google plus提供商登录,则为#34; http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name&#34 ;
现在我不想在提供商类型上做一个if / else来获得正确的声明,因为我可能有许多不同的提供商选项,每个选项都有不同的用户全名声明类型,那么什么是这样做的正确方法......这是正确的做法吗?
以下是我的Startup.Auth.cs文件中的代码,我觉得这是谜题的一部分,但需要澄清一下:
var fb = new FacebookAuthenticationOptions()
{
AppId = "xxx",
AppSecret = "xxx",
Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
foreach (var x in context.User)
{
var claimType = string.Format("urn:facebook:{0}", x.Key);
string claimValue = x.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook"));
}
return Task.FromResult(0);
}
}
};
fb.Scope.Add("email");
app.UseFacebookAuthentication(fb);
var go = new GooglePlusAuthenticationOptions()
{
ClientId = "xxx",
ClientSecret = "xxx",
Provider = new GooglePlusAuthenticationProvider
{
OnAuthenticated = async context =>
{
context.Identity.AddClaim(new Claim(GooglePlusAccessTokenClaimType, context.AccessToken, XmlSchemaString, "GooglePlus"));
}
}
};
go.Scope.Add("profile");
app.UseGooglePlusAuthentication(go);