获取Microsoft Live账户的电子邮件地址

7

我正在使用mvc5 + c#开发网站,为用户提供外部登录选项(如Facebook、Google等)。

我尝试添加Microsoft Live作为新的登录方式,但是我无法获取连接的用户的电子邮件地址。

当某个Microsoft用户连接时,我会收到以下声明("KEY | VALUE"):

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier | ***************** 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | test 
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider | ASP.NET Identity 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier | **************
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | **************** 
urn:microsoftaccount:id | **************** 
urn:microsoftaccount:name | ****************
urn:microsoftaccount:access_token | **************************************************************

有没有办法使用这些信息来获取用户的电子邮件地址?

简短回答:不支持 - Bora
与论坛网站不同,我们在 [so] 上不使用“谢谢”、“感激任何帮助”或签名。请参阅“应该从帖子中删除‘Hi’、‘thanks’、标语和问候语吗? - John Saunders
2个回答

13

是的,有的。经过几个小时的尝试,我设法让它像这样工作:

在 startup.Auth.cs 中的代码

var ms = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationOptions();
ms.Scope.Add("wl.emails");
ms.Scope.Add("wl.basic");
ms.ClientId = "xxxxxxxxxxxxxxxxxxxxxx";
ms.ClientSecret = "yyyyyyyyyyyyyyyyyyyyy";
ms.Provider = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationProvider()
{
    OnAuthenticated = async context =>
    {
        context.Identity.AddClaim(new System.Security.Claims.Claim("urn:microsoftaccount:access_token", context.AccessToken));

        foreach (var claim in context.User)
        {
            var claimType = string.Format("urn:microsoftaccount:{0}", claim.Key);
            string claimValue = claim.Value.ToString();
            if (!context.Identity.HasClaim(claimType, claimValue))
                context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Microsoft"));
        }
    }
};

app.UseMicrosoftAccountAuthentication(ms);

在AccountController.cs中的ExternalLoginCallback函数中,用于获取电子邮件地址的代码:

string Email = string.Empty;

var externalIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Claims.FirstOrDefault(x => x.Type.Equals(
                                                    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
                                                    StringComparison.OrdinalIgnoreCase));
Email = emailClaim == null ? null : emailClaim.Value;

很好的答案,不幸的是我的项目是在MVC4中,我们没有使用OWin而是Oauth,所以你有一个类似于Oauth的解决方案吗? - Jay

0

对于在网站上添加Microsoft登录遇到问题的任何人:

我发现我只能获取我的Microsoft工作/学校帐户的电子邮件地址。我使用我的@gmail.com地址创建了一个Microsoft帐户,还有一个@outlook.com地址。当我查询它们的信息时,都没有任何电子邮件信息。但是,对于符合条件的地址,您可以通过执行GET请求来获取电子邮件信息:

https://apis.live.net/v5.0/me?access_token=ACCESS_TOKEN

ACCESS_TOKEN是已认证用户提供给您的令牌。有关此API的更多信息,请参见此链接:https://msdn.microsoft.com/en-us/library/office/dn659736.aspx

基本上,调用Microsoft Live API (apis.live.net)将向您提供用户已授权访问的信息(因此,如果您在应用程序中启用了wl.emails范围,则应该看到他们的电子邮件地址)。

*或者,当用户使用Microsoft登录登录您的站点时,他们对您的站点的请求将具有包含访问令牌和可能的电子邮件地址的标头(电子邮件地址位于标头“X-MS-CLIENT-PRINCIPAL-NAME”下,访问令牌也在HTTP标头中的“X-MS-TOKEN-MICROSOFT-ACCESS-TOKEN”下)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接