我正在使用Identityserver4和Net Core。我可以使用Google,Facebook,Twitter,LinkedIn和Microsoft进行身份验证,但现在我想将用户的个人资料图片作为外部提供商。我正在使用具有GrantTypes.Implicit的客户端,并尝试添加新的IdentityResource,如下所示:
new IdentityResource {
Name = "picture",
UserClaims = new List<string> {"picture" }
}
然后我添加了#34;图片&#34;作为我的客户的允许范围。这一切都是在黑暗中拍摄的,尽管我仍然试图绕过身份资源并允许范围。
因为我对identityserver4很新,所以要善待并尽可能详细。提前谢谢!
答案 0 :(得分:2)
标识资源中应该有一个名为“profile”的“范围”,其中包含一组用户声明 - 其中一个是“图片”。
由于您使用的是ASP.NET身份,因此您需要将任何给定用户的记录插入到AspNetUserClaims表中,其声明类型为“picture”,其中值为在线图像的URL。
获得“个人资料”范围的客户应在向UserInfo端点发出请求时收到此“图片”声明。
如果您想将该图片作为id_token的一部分,那么除了“profile”范围/资源之外,您还需要将“图片”声明添加到“openid”范围/资源。
(术语范围和资源在Identity Server数据模型中稍微混合在一起。)
-
要从Google获取图片声明,您可以执行以下操作:
info.Principal.Claims.Where(x => x.Type == "picture").Select(x => x.Value).FirstOrDefault()
-
使用Microsoft.AspNetCore.Authentication.Google时,即app.UseGoogleAuthentication(google.Options(externalCookieScheme)
,Google不会发送图片声明。
如果您切换到使用OIDC方法,那么Google会向您发送图片声明。
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc-google",
DisplayName = "Google",
Authority = "https://accounts.google.com",
ClientId = "",
ClientSecret = "",
Scope = { "profile", "email", "openid" },
CallbackPath = "signin-google",
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role",
ValidateIssuer = false
}
});