代码之家  ›  专栏  ›  技术社区  ›  X.Otano

Open Id Connect dutions-Identity Server 4//如何将特定用户授予具体的作用域?

  •  0
  • X.Otano  · 技术社区  · 6 年前

    我看了公开的身份证文件后有些怀疑。任何帮助都将不胜感激。

    以下任何 oidc流量

    a) 当您将access_令牌发送到受保护的api时,为什么或何时(例如)它需要检索有关拥有它的用户的声明?如果受保护的api想要使用一些关于经过身份验证的用户的数据,可能会这样?

    b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信? 返回的id帴令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况?

    c) Identity server 4:定义要保护的资源。它们可以是“标识资源”和“api资源”。在定义api资源时,可以在细粒度范围内定义。例如:

      Scopes =
            {
                new Scope()
                {
                    Name = "weather.api.full_access",
                    DisplayName = "Full access to WEATHER API",
                },
                new Scope
                {
                    Name = "weather.api.read_only",
                    DisplayName = "Read only access to WEATHER API"
                }
            }
    

    您还可以定义客户机,以及它们可以访问哪些范围。 你如何指定哪些用户可以访问特定的资源?我看不出你将如何映射使用同一客户端的用户的特定权限。

    步骤如下:

    1. 为客户端提供两个作用域的访问权限:“weather.api.完全访问","仅限weather.api.read帴"

    非常感谢!!

    2 回复  |  直到 6 年前
        1
  •  10
  •   Ruard van Elburg    6 年前

    IdentityServer有三个部分:

    1. ApiResource配置

    有两个令牌:访问令牌和标识令牌。访问令牌用于访问资源(api和UserInfo端点),标识令牌包含有关用户的信息。

    虽然IdentityServer是对用户进行身份验证,但它也包含授权配置。您可以使用类似PolicyServer的东西从IdentityServer中取出授权,但是对于基本授权,您不必这样做。

    有两种类型的用户声明:

    1. 关于用户身份的声明,如姓名、性别、birtday等。
    2. 声明用户被授权的内容,如角色、employeeId等。

    关于标识令牌,您唯一可以依赖的是它始终包含 sub

    另一方面,如果用户选择不给予同意,那么身份令牌将保持为空(子声明除外,因为scope=openid是必需的)。当从UserInfo端点请求时也是如此。

    关于访问令牌,它实际上使客户端能够访问资源(api)。在client_credentials流中,没有用户(因此也不会有身份令牌),而在其他flwo中,客户端将代表用户执行操作。第一个流和其他流之间的区别是 索赔。它告诉Api客户端请求访问的代表是谁。

    返回IdentityServer。IdentityServer的一项重要工作是过滤声明。因为用户可以有很多要求,但你只在需要的时候才想要。因此,每个令牌都会添加请求的声明。

    访问令牌中的声明依赖于上下文。因为只有API知道声明的含义。使用命名空间类型在声明之间进行区分。

    访问令牌包含来自请求的作用域/资源的所有声明。这意味着使用该令牌可以访问资源/范围内的所有api,而不必为每个api获取新的令牌。

    这也意味着代币可以变得相当大。在达到极限之前你应该避免的事情。这就是为什么您不希望在令牌中有权限。如果需要权限,则实现自己的授权服务器。

    对于用户来说,用户是身份的资源。但对望远镜一无所知。所以不能将作用域绑定到用户。客户机有作用域,这为api打开了大门,但api决定用户是否真正拥有访问权限。


    现在回答你的问题:

    a) 来自用户且与请求的声明类型匹配的所有声明都将添加到访问令牌中。其中请求的声明类型从请求的范围中获取。其中,将添加与请求范围相关的所有ApiResource声明类型以及请求范围本身的声明类型。

    如果Api需要有关用户的信息,那么它可以使用访问令牌来调用UserInfo端点。默认标识令牌仅包含 附属的

    offline_access 范围。在这里可以获取脱机访问文本。这是一个令牌,允许客户端请求新的访问令牌,而不需要用户输入。因此,如果用户离线,服务仍然可以继续。

    为了绕过丢失的用户信息,只需向用户请求信息并将其存储在本地。不管怎样,你很可能需要它。

    假设你有“天气”和“望远镜”资源weather.api.完全访问'和'仅限weather.api.read帴'(作为资源“weather”的一部分)。

    为了让比利有充分的权限 http://api/admin (值:对)向比利索赔。对于Jhon,在订阅表中添加一条记录。

    在一个api作用域上使用多个事件进行验证。您不希望客户端在只请求读取作用域时访问完整的访问功能。

    简而言之,IdentityServer可以实现所有这些。如果需要权限,请查看策略服务器。

        2
  •  1
  •   Vidmantas Blazevicius    6 年前

    a) 当您将access_令牌发送到受保护的api时,为什么或何时(例如)它需要检索有关拥有它的用户的声明?如果受保护的api想要使用一些关于经过身份验证的用户的数据,可能会这样?

    例如,如果您的用户可以细分为多个组织或部门,并且您希望在api中添加一个策略,以便仅允许在用户位于这些细分组之一时访问某些端点,则可以添加自定义声明 "organisationid" "departmentid authorization 可能会错误地试图在内部解决 authentication .

    b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信?它发送访问令牌?返回的id帴令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况?

    AlwaysIncludeUserClaimsInIdToken id_token 因此,默认情况下不需要往返于UserInfo端点。如果你真的要往返旅行,那你说的“需要发送”是正确的 access_token 但是,返回的不是 ,而是用户信息。 IdentityServer4 docs :

    请求:GET/connect/userinfo

    响应:HTTP/1.1 200 OK 应用类型:json/Content “name”:“鲍勃·史密斯”, “family_name”:“史密斯”, “角色”:[ “管理员” ] }

    你如何指定哪些用户可以访问特定的资源?

    这很有可能通过 Authorization 授权 通常根据问题域的需要在每个应用程序中进行不同的处理。我建议你看看 Policy Server