[英]Save additional profile data during "Register" in ASP.Net Identity (MVC)
[英]Retrieving additional profile information from Facebook during external login/register with ASP.NET Web API 2.0 and Identity
关于如何使用ASP.NET Identity和MVC客户端从Facebook配置文件中获取更多信息的文档似乎很多,但是我似乎找不到关于如何从Web API控制器访问附加信息声明的任何信息。 。
我的Startup.Auth.cs ConfigAuth方法包含此内容,如果我在JObject WholeUser = context.User上设置断点,该方法似乎可以正常工作
String XmlSchemaString = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims";
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
AppId = "*",
AppSecret = "*",
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
JObject wholeUser = context.User;
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email, XmlSchemaString, "Facebook"));
return Task.FromResult(0);
}
}
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
一旦通过身份验证,wholeUser将拥有我需要的所有信息,例如出生日期等,但是一旦超出此范围,我将不知道该如何获得它。
我需要在AccountController.RegisterExternal中获取此信息,但似乎无法正确配置它。 许多MVC doco在ExternalLoginCallback方法中使用此方法:
ClaimsIdentity claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
但是在Web API中找不到AuthenticationManager,因此,如果将其更改为Authentication,除非将参数更改为DefaultAuthenticationTypes.ExternalBearer,否则它将返回null。 这与我所获得的差不多,但是返回的ClaimsIdentity对象没有任何其他声明-仅用户名和ID。
总体而言,好像我是从Facebook正确获取信息并将其塞入上下文一样,但后来我不知道如何从控制器访问信息。 注意:ConfigAuth中的上下文对象的类型为Microsoft.Owin.Security.Facebook.FacebookAuthenticatedContext
我不确定您是否需要与我做的相同的事情,但是请看一下http://aliu.ro/easy-mvc4-facebook-authentication-example/
有一个小示例项目可以进行Facebook身份验证,检索访问令牌并使用我在NuGet中找到的某些.NET SDK进行调用
我在这里使用了以下代码;
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
AppId = "*",
AppSecret = "**",
Provider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));
return Task.FromResult(0);
}
},
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
现在,在RegisterExternal方法中,该索赔对我可用。 我只是不知道如何将其持久保存在身份中,以便可以在其他Controller调用中使用它。 如果我将声明添加到身份中,则似乎在其他调用上打破了User.Identity对象;
ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
还有FromIdentity方法;
public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
{
if (identity == null)
{
return null;
}
string userEmail = string.Empty;
string userFacebookAccessToken = string.Empty;
Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
Claim facebookToken = identity.Claims.First(x => x.Type.Contains("access_token"));
Claim emailDetails = identity.FindFirst(ClaimTypes.Email);
if (facebookToken != null) userFacebookAccessToken = facebookToken.Value;
if (emailDetails != null) userEmail = emailDetails.Value;
//string userEmail = identity.Claims.First(x => x.Type.Contains("emailaddress")).Value;
if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
|| String.IsNullOrEmpty(providerKeyClaim.Value))
{
return null;
}
if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
{
return null;
}
return new ExternalLoginData
{
LoginProvider = providerKeyClaim.Issuer,
ProviderKey = providerKeyClaim.Value,
UserName = identity.FindFirstValue(ClaimTypes.Name),
Email = userEmail,
FacebookAccessToken = userFacebookAccessToken
};
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.