我正在开发使用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上建立一个项目,以获得ClientId
和ClientSecret
。
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);
请注意,这还将访问 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保存到数据库中。
希望能对某人有所帮助。