【问题标题】:How do I get the user's email when using Microsoft Account Authentication in an MVC project?在 MVC 项目中使用 Microsoft 帐户身份验证时如何获取用户的电子邮件?
【发布时间】:2017-08-09 00:50:07
【问题描述】:

我已修改 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:为输入参数“范围”提供的值无效。 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

【问题讨论】:

  • 这是一个 ASP.Net Web 应用程序(.Net 框架)。我将使用 ASP.Net Core Web 应用程序 (.Net Core) 来尝试整个过程。界面略有不同,即它使用 MicrosoftAccountOptions 而不是 MicrosoftAccountAuthenticationOptions。

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


【解决方案1】:

尝试添加范围:

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

【讨论】:

  • 在问题中你会注意到我试过了。它确实要求访问用户电子邮件的权限。但是,该电子邮件不会在 loginInfo 或 ClaimsPrincipal.Current 中返回。如何找回电子邮件?
  • Facebook 和 Google 在 loginInfo 中返回电子邮件。微软把它放在哪里了?
【解决方案2】:

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

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

【讨论】:

  • 我尝试在 ExternalLoginCallback 中使用它。但是,它不返回任何内容。我认为根本问题是我不知道如何在原始请求的范围内获取电子邮件。结果 loginInfo 不包含该信息,我无法在 ClaimsPrincipal.Current 中的任何地方找到它。我能够将电子邮件添加到 Facebook 的范围内。默认情况下,谷歌有电子邮件。在 Twitter 的情况下,我不得不调用他们的凭据验证 API 来获取它(我不喜欢这个解决方案,但我不知道有任何其他方式可以从 Twitter 获取电子邮件)。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2019-06-25
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多