65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (6投票s)

2015年12月29日

CPOL

2分钟阅读

viewsIcon

21409

如何从 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 并创建 ClientIdClientSecret,但如果您想请求用户的电子邮件和其他信息,您还应该添加一个名为 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 检索电子邮件,您首先需要添加 AppIdAppSecret,然后指定您想从 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。

© . All rights reserved.