在默认MVC5应用程序中的帐户关联步骤中从外部提供商Google和Facebook获取电子邮件

 ym_泳梅 发布于 2023-02-12 20:20

显然,您可以通过在以下FacebookAuthenticationOptions对象中添加范围来向Facebook提供商执行此操作Startup.Auth.cs:

http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx

List scope = new List() { "email" };
var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
...
app.UseFacebookAuthentication(x);

如何与Google提供商进行相同的操作?类/对象没有x.Scope属性GoogleAuthenticationOptions!

2 个回答
  • 您需要显式配置FacebookAuthenticationOptions以从经过身份验证的用户获取电子邮件地址.

    在MVC5项目中,在Startup.Auth.cs中添加这些行

            var options = new FacebookAuthenticationOptions() {
                AppId = "xxxxxxxx",
                AppSecret = "xxxxxxxxx"
            };
            options.Scope.Add("email");
            app.UseFacebookAuthentication(options);
    

    更新 将我的示例代码减少到绝对最小值.你的更新代码顺便说一下,我也试过Facebook和谷歌.

    2023-02-12 20:23 回答
  • 请在本帖子的底部看到更新!

    以下适合我的Facebook:

    StartupAuth.cs:

    var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
    {
        AppId = "x",
        AppSecret = "y"
    };
    facebookAuthenticationOptions.Scope.Add("email");
    app.UseFacebookAuthentication(facebookAuthenticationOptions);
    

    ExternalLoginCallback方法:

    var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
    var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
    var email = emailClaim.Value;
    

    而对于谷歌:

    StartupAuth.cs

    app.UseGoogleAuthentication();
    

    ExternalLoginCallback方法(与facebook相同):

    var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
    var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
    var email = emailClaim.Value;
    

    如果我在这里设置断点:

    var email = emailClaim.Value;
    

    我在调试器中看到了Facebook和Google的电子邮件地址.

    更新1:旧答案让我感到困惑所以我用自己项目中的代码更新了它,我刚刚调试过,我知道有效.

    更新2:使用新的ASP.NET Identity 2.0 RTM版本,您不再需要本文中的任何代码.获取电子邮件的正确方法是简单地执行以下操作:

      Startup.Auth.cs

          app.UseFacebookAuthentication(
             appId: "x",
             appSecret: "y");
      
          app.UseGoogleAuthentication();
      

      AccountController.cs

      //
      // GET: /Account/ExternalLoginCallback
      [AllowAnonymous]
      public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
      {
          var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
          if (loginInfo == null)
          {
              return RedirectToAction("Login");
          }
      
          // Sign in the user with this external login provider if the user already has a login
          var result = await SignInHelper.ExternalSignIn(loginInfo, isPersistent: false);
          switch (result)
          {
              case SignInStatus.Success:
                  return RedirectToLocal(returnUrl);
              case SignInStatus.LockedOut:
                  return View("Lockout");
              case SignInStatus.RequiresTwoFactorAuthentication:
                  return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
              case SignInStatus.Failure:
              default:
                  // If the user does not have an account, then prompt the user to create an account
                  ViewBag.ReturnUrl = returnUrl;
                  ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                  return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
          }
      }
      

    2023-02-12 20:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有