ASP.NET Identity中Facebook登录获取访问令牌及用户头像方法咨询
1. 如何在ASP.NET Identity中通过Facebook登录获取访问令牌?
要获取Facebook登录的访问令牌,核心是在身份验证配置中开启令牌保存,并在登录回调中提取:
步骤1:配置Facebook身份验证时启用令牌保存
在Program.cs(或旧版本的Startup.cs)中配置Facebook登录时,设置SaveTokens = true,让ASP.NET Identity将令牌保存到身份验证属性中:builder.Services.AddAuthentication() .AddFacebook(options => { options.AppId = "你的Facebook应用ID"; options.AppSecret = "你的Facebook应用密钥"; options.SaveTokens = true; // 必须开启此选项才能保存令牌 });步骤2:在登录回调中提取访问令牌
在外部登录的回调方法中(比如AccountController的ExternalLoginCallback),通过SignInManager获取登录信息,再从中提取访问令牌:var loginInfo = await _signInManager.GetExternalLoginInfoAsync(); if (loginInfo != null) { // 从身份验证令牌集合中获取Facebook访问令牌 var accessToken = loginInfo.AuthenticationTokens .FirstOrDefault(t => t.Name == "access_token")?.Value; // 拿到token后即可用于调用Facebook Graph API }
2. ASP.NET应用中Facebook登录后获取用户头像的方法
根据Facebook的API规则(2020年10月更新后),获取用户头像必须使用用户访问令牌,但只需通过登录时获取的令牌即可实现,无需额外申请权限(public_profile权限默认包含在登录请求中),具体步骤如下:
前提:确保已获取访问令牌
按照第一个问题的方法,先配置并拿到Facebook的用户访问令牌。调用Facebook Graph API获取头像
可以通过两种方式获取头像:- 直接请求头像的URL(返回临时重定向地址,可直接用于显示):
using (var httpClient = new HttpClient()) { var userId = loginInfo.Principal.FindFirstValue(ClaimTypes.NameIdentifier); var avatarResponse = await httpClient.GetAsync( $"https://graph.facebook.com/{userId}/picture?type=large&access_token={accessToken}" ); if (avatarResponse.IsSuccessStatusCode) { // 获取头像的实际URL(通过响应的重定向地址) var avatarUrl = avatarResponse.RequestMessage.RequestUri.ToString(); // 可将此URL保存到用户表或直接用于页面显示 } } - 请求用户资料获取头像信息(返回包含头像URL的JSON数据):
using (var httpClient = new HttpClient()) { var userId = loginInfo.Principal.FindFirstValue(ClaimTypes.NameIdentifier); var profileResponse = await httpClient.GetAsync( $"https://graph.facebook.com/{userId}?fields=picture&access_token={accessToken}" ); if (profileResponse.IsSuccessStatusCode) { var profileData = await profileResponse.Content.ReadFromJsonAsync<dynamic>(); var avatarUrl = profileData.picture.data.url; // 使用或保存avatarUrl } }
- 直接请求头像的URL(返回临时重定向地址,可直接用于显示):
如果当前登录时未收到令牌,检查是否在Facebook身份验证配置中设置了SaveTokens = true,这是保存并获取令牌的关键配置。
内容的提问来源于stack exchange,提问作者Kjensen
相关产品推荐
相关产品推荐

