.net core 2.0 外部登录 - 额外的个人资料信息
.net core 2.0 external login - extra profile information
我有一个 .net core 2.0 应用程序,并且正在实施外部登录提供程序,例如 google、twitter 和 facebook。我有获取用户的显示名称和个人资料图片的要求,但找不到有关如何在 .net core 2.0 中实现此目的的任何文档。
我这样添加身份验证post:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
这是我的 Twitter 登录和回调函数...
[HttpGet]
[Route("/api/security/login/type/socialmedia/twitter")]
public IActionResult GetTwitterLogin(string redirect_uri)
{
ClientCallback = redirect_uri;
string redirectUrl = "/api/security/login/type/socialmedia/twittercallback";
var properties = SignInManager.ConfigureExternalAuthenticationProperties("Twitter", redirectUrl);
return Challenge(properties, "Twitter");
}
[HttpGet]
[Route("/api/security/login/type/socialmedia/twittercallback")]
public async Task<HttpResponseMessage> GetTwitterCallBackAsync()
{
var info = await SignInManager.GetExternalLoginInfoAsync();
var result = await SignInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
}
else
{
}
Response.StatusCode = (int)HttpStatusCode.OK;
return null;
}
您似乎可以从 info.Principal.Claims 中获得一些物品,但对于用户的显示名称或个人资料照片却一无所获。
如何获取各种登录提供商的显示名称或个人资料图片?
我终于想通了...您需要在配置身份验证时添加声明。这些声明查看生成的 json 响应并从中提取项目。相关行是 ClaimActions 项目。
services.AddAuthentication()
.AddTwitter(twitterOptions =>
{
twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"];
twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"];
twitterOptions.SaveTokens = true;
twitterOptions.RetrieveUserDetails = true;
twitterOptions.ClaimActions.MapJsonKey("display-name", "name");
twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https");
})
.AddFacebook(facebookOptions =>
{
facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"];
facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"];
facebookOptions.SaveTokens = true;
facebookOptions.ClaimActions.MapJsonKey("display-name", "name");
})
.AddGoogle(googleOptions =>
{
googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"];
googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"];
googleOptions.SaveTokens = true;
googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url");
googleOptions.ClaimActions.MapJsonKey("display-name", "displayName" );
});
在回调中使用
获取登录信息后
var info = await SignInManager.GetExternalLoginInfoAsync();
如果填充成功,您可以查询声明并找到值
var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault();
Facebook 图片不同于 google 和 twitter,可以使用...
var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault();
var url = "http://graph.facebook.com/" + claim.Value + "/picture";
在 ASP.NET Core 2.0 中,FacebookOptions 在 ClaimActions 上使用扩展方法来映射 UserInformationEndpoint 返回的配置文件数据。
ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday");
在上面的映射中,"birthday" 是 Facebook Graph API 响应中的顶级 属性,它映射到由声明 ClaimTypes.DateOfBirth
表示的值。
要抓取个人资料图片,您可以执行相同的操作,但由于图表 API 响应中的图片是嵌套的 JSON 对象,因此您必须使用 MapCustomJson()
services.AddAuthentication()
.AddFacebook(options =>
{
// ...other options omitted
options.Fields.Add("picture");
options.ClaimActions.MapCustomJson("urn:facebook:picture",
claim => (string)claim.SelectToken("picture.data.url"));
})
这里,claim
是一个 NewtonSoft JObject
,它使用 JPath
语法 select 嵌套的 属性 值并将其转换为字符串。
个人资料照片 URL 现在将出现在您的 Claims
列表中。
我有一个 .net core 2.0 应用程序,并且正在实施外部登录提供程序,例如 google、twitter 和 facebook。我有获取用户的显示名称和个人资料图片的要求,但找不到有关如何在 .net core 2.0 中实现此目的的任何文档。
我这样添加身份验证post:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
这是我的 Twitter 登录和回调函数...
[HttpGet]
[Route("/api/security/login/type/socialmedia/twitter")]
public IActionResult GetTwitterLogin(string redirect_uri)
{
ClientCallback = redirect_uri;
string redirectUrl = "/api/security/login/type/socialmedia/twittercallback";
var properties = SignInManager.ConfigureExternalAuthenticationProperties("Twitter", redirectUrl);
return Challenge(properties, "Twitter");
}
[HttpGet]
[Route("/api/security/login/type/socialmedia/twittercallback")]
public async Task<HttpResponseMessage> GetTwitterCallBackAsync()
{
var info = await SignInManager.GetExternalLoginInfoAsync();
var result = await SignInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
}
else
{
}
Response.StatusCode = (int)HttpStatusCode.OK;
return null;
}
您似乎可以从 info.Principal.Claims 中获得一些物品,但对于用户的显示名称或个人资料照片却一无所获。
如何获取各种登录提供商的显示名称或个人资料图片?
我终于想通了...您需要在配置身份验证时添加声明。这些声明查看生成的 json 响应并从中提取项目。相关行是 ClaimActions 项目。
services.AddAuthentication()
.AddTwitter(twitterOptions =>
{
twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"];
twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"];
twitterOptions.SaveTokens = true;
twitterOptions.RetrieveUserDetails = true;
twitterOptions.ClaimActions.MapJsonKey("display-name", "name");
twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https");
})
.AddFacebook(facebookOptions =>
{
facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"];
facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"];
facebookOptions.SaveTokens = true;
facebookOptions.ClaimActions.MapJsonKey("display-name", "name");
})
.AddGoogle(googleOptions =>
{
googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"];
googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"];
googleOptions.SaveTokens = true;
googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url");
googleOptions.ClaimActions.MapJsonKey("display-name", "displayName" );
});
在回调中使用
获取登录信息后var info = await SignInManager.GetExternalLoginInfoAsync();
如果填充成功,您可以查询声明并找到值
var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault();
Facebook 图片不同于 google 和 twitter,可以使用...
var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault();
var url = "http://graph.facebook.com/" + claim.Value + "/picture";
在 ASP.NET Core 2.0 中,FacebookOptions 在 ClaimActions 上使用扩展方法来映射 UserInformationEndpoint 返回的配置文件数据。
ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday");
在上面的映射中,"birthday" 是 Facebook Graph API 响应中的顶级 属性,它映射到由声明 ClaimTypes.DateOfBirth
表示的值。
要抓取个人资料图片,您可以执行相同的操作,但由于图表 API 响应中的图片是嵌套的 JSON 对象,因此您必须使用 MapCustomJson()
services.AddAuthentication()
.AddFacebook(options =>
{
// ...other options omitted
options.Fields.Add("picture");
options.ClaimActions.MapCustomJson("urn:facebook:picture",
claim => (string)claim.SelectToken("picture.data.url"));
})
这里,claim
是一个 NewtonSoft JObject
,它使用 JPath
语法 select 嵌套的 属性 值并将其转换为字符串。
个人资料照片 URL 现在将出现在您的 Claims
列表中。