最近我也需要访问 Google 账户的个人头像,这里是我解决方法:
如果你只是在 Startup.Auth.cs 文件中启用代码app.UseGoogleAuthentication();
,这是不够的,因为在这种情况下,Google 不会返回任何关于个人头像的信息(或者我没有找到如何获取它的方法)。
你真正需要的是使用 OAuth2 集成而不是默认启用的 Open ID。这里是我是如何做到的...
首先,你需要在 Google 端注册你的应用程序并获取“客户端 ID”和“客户端密钥”。一旦完成,你就可以继续进行(以后会用到它)。有关如何执行此操作的详细信息,请参见此处。
将app.UseGoogleAuthentication();
替换为
var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
{
ClientId = "<<CLIENT ID FROM GOOGLE>>",
ClientSecret = "<<CLIENT SECRET FROM GOOGLE>>",
CallbackPath = new PathString("/Account/ExternalGoogleLoginCallback"),
Provider = new GoogleOAuth2AuthenticationProvider() {
OnAuthenticated = async context =>
{
context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
}
}
};
googleOAuth2AuthenticationOptions.Scope.Add("email");
app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);
之后你可以使用这段代码获取个人资料图片的URL,与其他属性的方式相同
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var pictureClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picture"));
var pictureUrl = pictureClaim.Value;