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

我该如何实现?

到目前为止,我使用默认的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);

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

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

最佳答案

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

我没有使用GoogleAuthenticationOptions,而是使用GoogleOAuth2AuthenticationOptions,这意味着您需要首先在https://console.developers.google.com/project上建立一个项目,以获得ClientIdClientSecret

  • 在该链接(https://console.developers.google.com/project)中,创建一个项目,然后选择它。
  • 然后在左侧菜单上,单击“API和身份验证”。
  • 在“API”下,确保将“Google+ API”设置为“开”。
  • 然后单击“凭据”(在左侧菜单中)。
  • 然后单击“创建新的客户端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);
    

    请注意,这还将访问 token 添加为声明,因此我们可以使用它来检索个人资料图像。接下来的内容可能会有所不同,具体取决于您如何设置项目,但是对我来说,它位于AccountController中。

    ExternalLoginCallback方法中,我检查使用了哪个登录提供程序,并处理Google登录数据。在本节中,我将检索个人资料图片网址,并将其存储在带有以下代码的变量中:
    //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;
    }
    

    这使用访问 token 来向Google请求用户信息。然后,它从json数据返回中检索图像url。然后,您可以按照最适合您项目的方式将URL保存到数据库中。

    希望能对某人有所帮助。

    10-08 02:24