【问题标题】:Getting all the claims from a WebApi for a user in Identity Server 4从 WebApi 为 Identity Server 4 中的用户获取所有声明
【发布时间】:2020-01-06 19:59:46
【问题描述】:

我已经浏览了 Ids4 的示例,特别是 client-webapi 场景。

https://github.com/IdentityServer/IdentityServer4/tree/master/samples/Clients

该示例主要说明了客户端如何获取访问令牌、将访问令牌发送到 WebAPI 以及 WebAPI 根据范围或声明等策略进行检查。

我的场景有以下限制。

  • 访问令牌包含最少的信息。意思是我不放 所有其中最敏感的信息。
  • WebAPI 要求策略(不仅仅是范围)的这些声明,因为声明将特定于用户,而不是客户端应用程序。

例子

options.AddPolicy("User", policy =>
{
    policy.RequireClaim("ProfileAccess","user:read");
});
options.AddPolicy("Admin", policy =>
{
    policy.RequireClaim("ProfileAccess", "user:read", "user:write");
});

在 MVC 客户端中,OpenId Connect 配置有一个选项 GetClaimsFromUserInfoEndpoint,它使用令牌调用 UserInfo 端点并将这些声明转换为主体的声明。 WebAPI 有类似的东西还是我必须自己实现它?我也不想在访问令牌中包含太多信息。

【问题讨论】:

  • 从技术上讲,用户信息端点是身份服务器中内置的 Web api 端点。

标签: c# asp.net-core asp.net-web-api .net-core identityserver4


【解决方案1】:

最简单的方法是在 Identity Server 发出访问令牌时在访问令牌中包含所需的声明。这样 API 将在验证令牌后获取声明,您可以创建策略要求来检查声明。您可以定义 API resources 以包含用户声明。请参阅定义 API 资源:

http://docs.identityserver.io/en/latest/reference/api_resource.html#refapiresource

您可以在 ApiResource(和 Scope)上找到 UserClaims 属性,以添加应包含在访问令牌中的关联用户声明类型列表。

GetClaimsFromUserInfoEndpoint 不是为 API 设计的,请参阅this article 了解更多详情。

如果不想在tokens中包含声明,可以使用delegation fow获取新的access token来获取用户信息。

【讨论】:

  • 很好的答案@nan-yu!我一直在阅读有关身份服务器的信息,但现在才知道这一点。我一直认为 API 和 Client 是一样的,但最有意义。
  • @d_f ,我想我现在明白你的意思了。是的,如果without getting them in the token,那么您将需要委托流程来获取新令牌以获取信息。但我的建议是在 IDS4 颁发令牌时包含所需用户的声明。我会修改回复:)
【解决方案2】:

看起来,你需要的是一种Extension grant,即delegation

您希望为您的 API 提供比您的客户端更多的访问权限,但您不能只使用 ClientCredentials 流或授权,因为它不携带用户信息。这正是委托可以提供帮助的情况:您为 API 提供一个仅带有 sub (userId) 声明的令牌,API 请求一个全新的令牌,同时提供它自己的凭据和原始令牌。

回答原始问题:尽管在技术上可以使用原始令牌,但通过客户端的请求进入 API,它不会提高安全性:如果您的客户端是 JS-app 并且它保留原始令牌在浏览器的会话或本地存储中,每个人都可以获取该令牌并从 curlpostman 调用UserInfoendpoint。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2018-04-29
    • 2018-10-06
    • 2020-12-07
    • 2020-06-30
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多