Получение электронной почты от внешних поставщиков Google и Facebook во время подключения к учетной записи в приложении MVC5 по умолчанию

Очевидно, вы можете сделать это с помощью провайдера Facebook, добавив области действия в объект FacebookAuthenticationOptions в 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 для classа / объекта GoogleAuthenticationOptions !

ПОЖАЛУЙСТА, ВИДИТЕ ОБНОВЛЕНИЯ НА НОМЕРЕ ЭТОГО ПОЧТА!

Следующие работы для меня для 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; 

И для Google :

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 : с новой версией RTM версии ASP.NET Identity 2.0 вам больше не нужен какой-либо код в этом сообщении. Правильный способ получить электронную почту – просто сделать следующее:

  1. Startup.Auth.cs

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

     // // GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task 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 }); } } 

Вам нужно явно настроить функцию FacebookAuthenticationOptions, чтобы получить адрес электронной почты от аутентифицированного пользователя.

В проекте MVC5 добавьте эти строки в Startup.Auth.cs

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

Обновление Сократил мой пример кода до абсолютного минимума. Ваш обновленный код работает отлично, я также попробовал его как с Facebook, так и с Google.

В аутентификации ASP.NET Core Facebook промежуточное программное обеспечение Facebook, похоже, больше не проходит в письме, даже если вы добавите его в область видимости. Вы можете обойти это, используя Facebook Graph Api, чтобы запросить электронное письмо.

Вы можете использовать любой Facebook Graph Api-клиент или катить свой собственный и использовать его для вызова Graph api следующим образом:

 app.UseFacebookAuthentication(options => { options.AppId = Configuration["Authentication:Facebook:AppId"]; options.AppSecret = Configuration["Authentication:Facebook:AppSecret"]; options.Scope.Add("public_profile"); options.Scope.Add("email"); options.Events = new OAuthEvents { OnCreatingTicket = context => { // Use the Facebook Graph Api to get the user's email address // and add it to the email claim var client = new FacebookClient(context.AccessToken); dynamic info = client.Get("me", new { fields = "name,id,email" }); context.Identity.AddClaim(new Claim(ClaimTypes.Email, info.email)); return Task.FromResult(0); } }; }); 

Вы можете найти более подробный пример того, как его использовать здесь: http://zainrizvi.io/2016/03/24/create-site-with-facebook-login-using-asp.net-core/#getting-the -Е-адрес из-Facebook

  • Передать список флажков в View и вытащить IEnumerable
  • обновление с MVC4 до MVC5
  • Представленный частичный вид не соответствует модели
  • Как экспортировать в Excel?
  • Динамические строки MVC 5 с BeginCollectionItem
  • Как использовать Json.NET для JSON-моделирования в проекте MVC5?
  • Страница входа в другой домен
  • Создание и запуск проекта MVC 5 в VS 2012
  • ASP.NET MVC 5 культура в маршруте и URL-адресе
  • Обработка ошибок ASP.NET MVC 5
  • Razor actionlink автогенерирует? Length = 7 в URL?
  • Давайте будем гением компьютера.