Подтвердить что ты не робот

Получение электронной почты от внешних поставщиков 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<string> scope = new List<string>() { "email" };
var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
...
app.UseFacebookAuthentication(x);

Как сделать то же самое с провайдером Google? Не существует свойства x.Scope для класса GoogleAuthenticationOptions class/object!

4b9b3361

Ответ 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 });
        }
    }
    

Ответ 2

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

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

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

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

Ответ 3

В аутентификации 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 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-email-address-from-facebook