Ответ 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-адрес в базе данных наиболее подходящим образом для своего проекта.
Надеюсь, что это поможет кому-то.