ASP.Net Identity和Mcirosoft外部登录问题

时间:2015-11-30 15:20:31

标签: asp.net-mvc asp.net-identity owin

我正在学习身份和OWIN。我已经实施了谷歌和Facebook登录。现在我正在尝试实现Microsoft登录和

  • 电子邮件为空
  • 没有个人信息,如名字,姓氏,地点等
Facebook有类似的问题,以下有助于获取数据:

Access email address in the OAuth ExternalLoginCallback from Facebook v2.4 API in ASP.NET MVC 5

https://developers.facebook.com/docs/graph-api/reference/user

如何从Microsoft获取数据?

enter image description here

1 个答案:

答案 0 :(得分:1)

对于电子邮件,您需要添加范围"wl.emails"。要访问其余数据,您需要添加声明,以便从控制器获取声明。

Startup.Auth.cs中,您需要以下内容:

var msaccountOptions = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationOptions()
{
    ClientId = /* client id */,
    ClientSecret = /* client secret */,
    Provider = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:microsoftaccount:access_token", context.AccessToken, XmlSchemaString, "Microsoft"));
            foreach (var x in context.User)
            {
                var claimType = string.Format("urn:microsoftaccount:{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, "Microsoft"));

            }

            return Task.FromResult(0);
        }
    }
};
msaccountOptions.Scope.Add("wl.emails");
app.UseMicrosoftAccountAuthentication(msaccountOptions);

然后,在您的控制器操作中,您可以访问用户详细信息,如:

var identity = await HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var firstNameClaim = identity.Claims.FirstOrDefault(c => c.Type.EndsWith("first_name"));
var firstName = firstNameClaim != null ? firstNameClaim.Value : null;

您需要查阅API文档,以确定您正在使用的服务的正确声明值。