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

Как получить изображение Google+ с профилем в С# MVC-аутентификации

Я разрабатываю приложение С# ASP.NET MVC 5, которое использует Google для входа в качестве поставщика по умолчанию. Функциональность входа в систему работает нормально, и я могу получить электронное письмо и имя пользователя. Одна вещь, которая мне нужна, это получить изображение профиля пользователя.

Как я могу это достичь?

До сих пор я использовал стандартную MVC-аутентификацию "UseGoogleAuthentication".

Microsoft.Owin.Security.Google.GoogleAuthenticationOptions a = new Microsoft.Owin.Security.Google.GoogleAuthenticationOptions();

var googleOption = new GoogleAuthenticationOptions()
{
    Provider = new GoogleAuthenticationProvider()
    {
         OnAuthenticated = (context) =>
         {
              var rawUserObjectFromFacebookAsJson = context.Identity;
              context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name)));
              context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email)));
              return Task.FromResult(0);
         }
    }
};

app.UseGoogleAuthentication(googleOption);

Вот как я могу получить адрес электронной почты. Но как насчет картины профиля?

Нужно ли использовать другую форму аутентификации?

4b9b3361

Ответ 1

Я знаю, что это поздний ответ, но нашел ваш вопрос во время работы над той же проблемой. Вот мое решение.

Вместо использования GoogleAuthenticationOptions я использовал GoogleOAuth2AuthenticationOptions, что означает, что сначала нужно создать проект https://console.developers.google.com/project, чтобы получить ClientId и ClientSecret.

  • В этой ссылке (https://console.developers.google.com/project) создайте проект и выберите его.

  • Затем в меню слева выберите "API и auth".

  • В разделе "API" убедитесь, что у вас установлен "API Google+" на "On".

  • Затем нажмите "Учетные данные" (в меню слева).

  • Затем нажмите кнопку "Создать новый идентификатор клиента". Следуйте инструкциям, и тогда вам будут предоставлены ClientId и ClientSecret, обратите внимание на оба.

Теперь у вас есть, код GoogleOAuth2AuthenticationOptions выглядит следующим образом:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = [INSERT CLIENT ID HERE],
    ClientSecret = [INSERT CLIENT SECRET HERE],
    Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name)));
            context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email)));
            //This following line is need to retrieve the profile image
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:google:accesstoken", context.AccessToken, ClaimValueTypes.String, "Google"));

            return Task.FromResult(0);
        }
    }
};

app.UseGoogleAuthentication(googleOptions);

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

В моем методе ExternalLoginCallback я проверяю, для какого пользователя используется поставщик доступа, и обрабатывайте данные для входа в Google. В этом разделе я получаю URL-адрес изображения профиля и сохраняю его в переменной со следующим кодом:

//get access token to use in profile image request
var accessToken = loginInfo.ExternalIdentity.Claims.Where(c => c.Type.Equals("urn:google:accesstoken")).Select(c => c.Value).FirstOrDefault();
Uri apiRequestUri = new Uri("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + accessToken);
//request profile image
using (var webClient = new System.Net.WebClient())
{
    var json = webClient.DownloadString(apiRequestUri);
    dynamic result = JsonConvert.DeserializeObject(json);
    userPicture = result.picture;
}

Это использует токен доступа для запроса информации о пользователе из Google. Затем он извлекает URL-адрес изображения из возврата данных json. Затем вы можете сохранить URL-адрес в базе данных наиболее подходящим образом для своего проекта.

Надеюсь, что это поможет кому-то.

Ответ 2

Это может быть сделано проще. Не уверен, что это всегда было так, но вот мой код (ASP.NET 5):

private static Task OnGoogleAuthenticated(GoogleAuthenticatedContext context)
{
    var identity = ((ClaimsIdentity)context.Principal.Identity);
    var pictureUrl = context.User["image"].Value<string>("url");
    // Pass the picture url as a claim to be used later in the application
    identity.AddClaim(new Claim("pictureUrl", pictureUrl));
    return Task.FromResult(0);
}

В ExternalLoginCallback, pictureUrl затем может быть извлечен напрямую, используя:

var info = await signInManager.GetExternalLoginInfoAsync();
...
var picture = info.ExternalPrincipal.FindFirstValue("pictureUrl");