C# 阅读Facebook的声明——这是一个好方法吗?
我试图在验证用户身份后阅读FB声明。这是我目前的代码: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
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
。非常感谢您的帮助!