从 Google、Microsoft 和 Facebook 外部登录提供程序检索电子邮件






4.93/5 (6投票s)
如何从 Google、Microsoft 和 Facebook 外部登录提供程序检索电子邮件
引言
在这篇文章中,我将向您展示如何在 ASP.NET MVC 应用程序中从 Facebook、Google 和 Microsoft 的 OAuth 外部登录提供程序检索电子邮件地址。我不会讨论如何使用这些提供程序,因为有很多好的资源可以参考。其中之一是 OAuth for ASP.NET (更新:网站已关闭,但源代码可在 github 上获取)。我还讨论了 Twitter,它不允许您检索电子邮件,至少在您向 Twitter 团队发送请求并请求启用此功能之前是这样。
从 Google 外部登录提供程序检索电子邮件
使用 Google 外部登录提供程序,您无需执行任何特殊操作即可检索电子邮件。如果您在 Startup.Auth.cs 中正确设置了 GoogleOAuth2AuthenticationOptions
,则可以从 ExternalLoginInfo
类的 Email
属性中检索电子邮件,并在注册用户时使用它,当然,如果您不使用电子邮件作为用户的登录方式。
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
string email = info.Email;
从 Microsoft 外部登录提供程序检索电子邮件
首先要做的是设置您的 MicrosoftAccountAuthenticationOptions
并创建 ClientId
和 ClientSecret
,但如果您想请求用户的电子邮件和其他信息,您还应该添加一个名为 Scope
的东西。通过添加 Scope
,您正在请求 API 获得用户披露此信息的权限。
var microsoftOptions = new MicrosoftAccountAuthenticationOptions
{
Caption = "Example Microsoft Account Authentication",
ClientId = "000000054f5f5",
ClientSecret = "Yx6IAzobgdfgdfguHSgN5857oUT4zzk",
Scope = { "wl.emails", "wl.basic" }
};
app.UseMicrosoftAccountAuthentication(microsoftOptions);
接下来,在您的 ExternalLoginConfirmation
方法中,您可以使用它来检索用户在使用 Microsoft 帐户登录时用户的电子邮件。
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info.Login.LoginProvider == "Microsoft")
{
var identity = await AuthenticationManager.AuthenticateAsync(
DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = identity.Identity.FindFirst(ClaimTypes.Email);
info.Email = emailClaim.Value;
}
从 Facebook 外部登录提供程序检索电子邮件
要使用 Facebook 外部登录提供程序检索电子邮件,您必须使用一个包。 此包 提供了 FacebookClient
类,您可以使用它来查询 Facebook 以获取用户信息,例如,要从 Facebook 检索电子邮件,您首先需要添加 AppId
和 AppSecret
,然后指定您想从 Facebook API 获取的内容作为范围,最后将 AccessToken
保存为声明。
var faceBookOptions = new FacebookAuthenticationOptions
{
AppId = "169866578967501",
AppSecret = "b6wer3dwer5ertg8er8cbrtyefe",
Scope = { "email" },
Provider = new FacebookAuthenticationProvider
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim
("FacebookAccessToken", context.AccessToken));
return Task.FromResult(true);
}
}
};
app.UseFacebookAuthentication(faceBookOptions);
在您的 ExternalLoginConfirmation
方法中
if (info.Login.LoginProvider == "Facebook")
{
var identity = AuthenticationManager.GetExternalIdentity
(DefaultAuthenticationTypes.ExternalCookie);
var accessToken = identity.FindFirstValue("FacebookAccessToken");
var fb = new FacebookClient(accessToken);
dynamic myInfo = fb.Get("/me?fields=email");
info.Email = myInfo.email;
}
在这里,我们首先检索身份验证令牌,然后使用该令牌获取 FacebookClient
的实例,然后查询该实例以获取我们想要的信息。此方法可用于检索任何其他类型的信息,而不仅仅是电子邮件,我们只需要添加必要的范围并以相同的方式使用 FacebookClient
实例,当然,我们需要确保我们在 Facebook 开发中心拥有必要的权限。
从 Twitter 外部登录提供程序检索电子邮件
Twitter 默认情况下不提供用户的电子邮件,我们需要使用 此表单 请求 Twitter 为我们启用它。Twitter 然后会检查您的应用程序,如果您通过了某些标准,他们将启用它,您就可以在您的应用程序中使用它,或者您可以始终要求用户提供电子邮件,如果提供程序是 Twitter。