C# 阅读Facebook的声明——这是一个好方法吗?

C# 阅读Facebook的声明——这是一个好方法吗?,c#,asp.net-mvc,facebook,claims-based-identity,owin,C#,Asp.net Mvc,Facebook,Claims Based Identity,Owin,我试图在验证用户身份后阅读FB声明。这是我目前的代码: public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); var externalIdentity = HttpContext.GetOwinContext().Authentic

我试图在验证用户身份后阅读FB声明。这是我目前的代码:

public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

    dynamic emailClaim = JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c => c.Type == ClaimTypes.Email).Value);
    dynamic locationClaim = JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c => c.Type == "urn:facebook:location").Value);
    dynamic genderClaim = JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c => c.Type == "urn:facebook:gender").Value);
    dynamic firstNameClaim = JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c => c.Type == "urn:facebook:first_name").Value);
    dynamic birthdateClaim = JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c => c.Type == "urn:facebook:birthday").Value);

    var email = emailClaim.email;
    var city = locationClaim.name.ToString().Split(',')[0];
    var country = locationClaim.name.ToString().Split(',')[1];

    var gender = genderClaim.gender;
    var firstname = firstNameClaim.first_name;
    var birthdate = DateTime.ParseExact(birthdateClaim.birthday, "MM/dd/yyyy", CultureInfo.InvariantCulture);
public异步任务ExternalLoginCallback(string returnUrl)
{
var loginInfo=await AuthenticationManager.GetExternalLoginInfoAsync();
var externalIdentity=HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
DynamicEmailClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==ClaimTypes.Email).Value);
DynamicLocationClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==“urn:facebook:location”).Value);
动态genderClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==“urn:facebook:gender”).Value);
dynamic firstNameClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==“urn:facebook:first_name”).Value);
dynamic birthdateClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==“urn:facebook:Birth”).Value);
var email=emailClaim.email;
var city=locationClaim.name.ToString().Split(',')[0];
var country=locationClaim.name.ToString().Split(',')[1];
var性别=genderClaim.gender;
var firstname=firstNameClaim.first\u name;
var birthdate=DateTime.ParseExact(birthdateClaim.birthday,“MM/dd/yyyy”,CultureInfo.InvariantCulture);
如您所见,我正在将FB声明转换为动态对象,以便以后可以更轻松地引用它


你认为这是一个好方法吗?我计划阅读提供商并应用策略模式来封装这个逻辑。听起来对你很好?或者我应该重构到其他东西吗?

你能分享更多相关的代码吗?我已经设置了使用facebook选项来设置scope
user\u Birth
,但下面的一行是动态的
birthdateClaim=JsonConvert.DeserializeObject(externalIdentity.Result.Claims.Single(c=>c.Type==“urn:facebook:Birth”).Value);
失败,因为在collection@Dmitry您必须使用以下行将其添加到您的作用域中:fbScopes.Scope.add(“用户生日”);我在
Startup.Auth.cs
中做了:
var fbOptions=new facebook authenticationoptions{AppId=“where”,AppSecret=“where”};fbOptions.Scope.Add(“email”);fbOptions.Scope.Add(“public_profile”);fbOptions.Scope.Add(“user_birth”);app.usefacebook验证(fbOptions);
仍然没有work@Dmitry你有我可以发送工作代码的电子邮件吗?是的,请发送到
dmitrief@gmail.com
。非常感谢您的帮助!