在MVC项目中使用微软账号认证时如何获取用户邮箱?

How do I get the user's email when using Microsoft Account Authentication in an MVC project?

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

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

这允许我对用户进行身份验证。

我尝试添加范围 wl.signin、wl.emailswl.contacts_emails。但是,它们会导致 Microsoft 登录页面报告以下错误:AADSTS70011:为输入参数 'scope' 提供的值无效。范围 wl.signin、wl.emails、wl.contacts_emails 无效。 openidemail 的范围组合 似乎有效。但是,范围 openid 对于我正在尝试做的事情来说太过分了。也就是说,我认为向用户要求太多了。范围 email 本身是行不通的。

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

如何只获取用户的电子邮件?

对于上下文,我使用了以下文档: https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#openid-permissions 给人的印象是我希望 emailprofile 包含在范围内。但是,它继续说明默认情况下包含它们。

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

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

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

尝试添加作用域:

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

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

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

有趣的是,这不会通知用户您正在获取他们的电子邮件地址。我有 Google、Facebook、Twitter、Microsoft 和 LinkedIn 在工作。现在使用 AccountKit 进行电子邮件和短信登录。