I am trying to read FB statements after user authentication. This is my code:
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);
As you can see, I am converting FB claims into a dynamic object, so I can later reference it more easily.
Do you think this is a good approach? I plan to read the provider and apply the strategy template to encapsulate this logic. Sounds good to you? Or do I need to reorganize something else?
source
share