【发布时间】:2021-02-06 01:51:04
【问题描述】:
我已经使用带有 ASP.Net Identity 的 asp.net 核心实现了 IdentityServer4 解决方案。到目前为止,一切都很好。 我已经配置了解决方案,使得用户声明不与访问令牌一起传输,并且客户端必须调用 UserInfo 端点来获取用户声明。 我遇到的问题是网站(客户端)调用一个公共 api,然后调用一个私有 api,我需要在其中访问用户声明。 我从私有 api 调用用户信息端点,请求用户声明并接收所有内容。我原本希望只收到由 APiResource 定义的声明(仅限 openid),但我收到了客户端请求的所有用户声明(openid、个人资料、电子邮件、地址等)。 我假设配置文件服务能够理解 apiresource 请求的用户信息——而不是客户端,从而减少了返回的声明,但这并没有发生。 我的问题是这个。如何让我的 ProfileService 知道调用的发起者,这样如果私有 api 调用 UserINfo itv 仅返回 ApiResource 中定义的那些声明?
我正在使用引用令牌,因此我的客户端如下所示(未包括所有属性)
new Client
{
ClientId = "client",
AccessTokenType = AccessTokenType.Reference,
ClientSecrets = { new Secret("secret".Sha256()) },
AllowedScopes = { "openid", "profile", "email" }
}
我定义了两个api资源如下:
new ApiResource("public_api"){
Scopes = new List<string> { "openid" }
}
new ApiResource("private_api"){
Scopes = new List<string> { "openid" },
}
我的客户(网站)请求以下范围:
openid, profile, email
使用上述配置,在每个级别检查 User.Claims 时,我看到以下值:
- WEBSITE 可以查看用户声明:姓名、family_name、given_name 和电子邮件
- PUBLIC API 没有用户声明信息
- PRIVATE API 没有用户声明信息
根据 Tore Nestenius 的建议,我将私有 api 资源更改如下:
new ApiResource("private_api"){
Scopes = new List<string> { "openid" },
UserClaims = { "email", "email_verified" }
}
重新运行应用程序,我现在看到以下值:
- WEBSITE 可以看到用户声明:name、family_name、given_name 和 email(没有变化,不知道为什么 email_verified 没有显示?)
- PUBLIC API 可以查看用户声明:email 和 email_verified
- PRIVATE API 可以查看用户声明:email 和 email_verified
我不明白为什么公共 api 会看到电子邮件用户声明?我原以为只有私有 api 会看到这些声明,但事实并非如此。理想情况下,我希望将每个微服务限制为仅查看针对 Api 资源定义的用户声明。 我希望这有助于澄清发生了什么。
【问题讨论】:
标签: asp.net-core microservices identityserver4