asp.net MVC - 如何在 C# MVC 身份验证中获取谷歌加个人资料图片

本文关键字:MVC 谷歌 获取 资料图片 net asp 身份验证 | 更新日期: 2023-09-27 17:56:28

我正在开发一个使用 Google 登录作为默认提供程序的 C# ASP.NET MVC 5 应用程序。登录功能工作正常,我可以获取用户的电子邮件和名称。我需要的一件事是获取用户的个人资料图片。

我怎样才能做到这一点?

到目前为止,我使用默认的MVC身份验证"使用GoogleAuthentication"。

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);

这就是我获取电子邮件地址的方法。但是个人资料图片呢?

我是否需要使用其他形式的身份验证?

asp.net MVC - 如何在 C# MVC 身份验证中获取谷歌加个人资料图片

我知道

这是一个迟到的答案,但在处理同一问题时发现了您的问题。这是我的解决方案。

我没有使用GoogleAuthenticationOptions而是使用了GoogleOAuth2AuthenticationOptions这意味着您需要首先在 https://console.developers.google.com/project 设置一个项目才能获得ClientIdClientSecret

  1. 在该链接 (https://console.developers.google.com/project) 中,创建一个项目,然后选择它。

  2. 然后在左侧菜单中,单击"API和身份验证"。

  3. 在"API"下,确保您已将"Google+ API"设置为"开"。

  4. 然后单击"凭据"(在左侧菜单中)。

  5. 然后点击"创建新的客户端ID"按钮。按照说明进行操作,然后将为您提供ClientIdClientSecret,请记下两者。

现在您有了这些,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 请求用户信息。然后,它从 json 数据返回中检索图像 URL。然后,您可以以最适合您的项目的方式将 url 保存到数据库中。

希望对某人有所帮助。

这可能更容易完成。不确定是否总是这样,但这是我的代码(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");

"image"不再有效,"url"也不再有效。现在你只需要得到

context.User["picture"].ToString()

在带有 IdentityServer4 的 .NET Core 2.2 上进行了测试。也许这与Google+ API的最新关闭有关。