在MVC项目中使用Microsoft帐户身份验证时如何获取用户的电子邮件?

时间:2017-07-23 22:23:34

标签: c# asp.net-mvc oauth owin

我修改了 startup.Auth.cs ,以便我可以添加范围。这就是我所拥有的:

MicrosoftAccountAuthenticationOptions mo = new MicrosoftAccountAuthenticationOptions()
{
    ClientId = "My Client ID",
    ClientSecret = "My Client Secret",
};
app.UseMicrosoftAccountAuthentication(mo);

这允许我验证用户。

我尝试添加范围 wl.signin,wl.emails wl.contacts_emails 。但是,它们会导致Microsoft登录页面报告以下错误: AADSTS70011:输入参数“scope”的提供值无效。范围wl.signin,wl.emails,wl.contacts_emails无效。 openid 电子邮件的范围组合似乎有效。但是,范围 openid 对于我想要做的事情来说是过度的。也就是说,我认为从用户那里询问太多了。范围电子邮件全部由它自己起作用。

这特别奇怪,因为Visual Studio设置的模板假定外部身份验证提供程序将提供电子邮件地址。

如何只收到用户的电子邮件?

对于上下文,我使用以下文档: https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#openid-permissions给出的印象是我希望范围中包含电子邮件个人资料。但是,它继续声明默认包含它们。

我正在尝试使用以下文档在我的MVC项目中实现外部身份验证:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins

3 个答案:

答案 0 :(得分:1)

尝试添加范围:

MicrosoftAccountAuthenticationOptions mo = new MicrosoftAccountAuthenticationOptions()
{
    ClientId = "My Client ID",
    ClientSecret = "My Client Secret",
};
mo.Scope.Add("openid");
mo.Scope.Add("email");
app.UseMicrosoftAccountAuthentication(mo);

答案 1 :(得分:0)

您可以使用以下代码获取用户的电子邮件地址。

 ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value.Split('#')[ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value.Split('#').Length - 1];

答案 2 :(得分:0)

您似乎必须使用 ASP.Net 核心 Web应用程序(.Net Framework)来获取电子邮件。代码类似,但 note MicrosoftAccountOptions ,而不是 MicrosoftAccountAuthenticationOptions

app.UseMicrosoftAccountAuthentication(new MicrosoftAccountOptions()
{
    ClientId = "My Client ID",
    ClientSecret = "My Client Secret"
});

有趣的是,这并不会通知用户您正在收到他们的电子邮件地址。我有谷歌,Facebook,Twitter,微软和LinkedIn工作。现在开始使用AccountKit进行电子邮件和短信登录。