Ответ 1
ПОЖАЛУЙСТА, ОБРАТИТЕСЬ ОБНОВЛЕНИЯ НА НИЖНЕЙ ПОЧТЕ!
Ниже для меня работает 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. С новой версией 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 }); } }