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

Oauth 2.0 Open Id Connect-Identity Server 4//如何将特定用户授予具体作用域?,oauth-2.0,openid,identityserver4,openid-connect,Oauth 2.0,Openid,Identityserver4,Openid Connect,看完开放Id文档后,我有一些疑问。任何帮助都将不胜感激 在任何一个oidc流之后,您都将拥有一个id_令牌和一个access_令牌 a) 当您将access_令牌发送到受保护的api时,它为什么或何时(例如)需要检索有关拥有它的用户的一些声明?如果受保护的api想要使用一些关于经过身份验证的用户的数据 b) 为了获得声明,受保护的api需要与UserEdnpoint端点通信? 它发送访问令牌? 返回的id_令牌中包含哪些声明?/如果它要求更多声明用户具有同意访问权限,会发生什么情况 c) Ide

看完开放Id文档后,我有一些疑问。任何帮助都将不胜感激

在任何一个oidc流之后,您都将拥有一个id_令牌和一个access_令牌

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

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

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

  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"
            }
        }
您还可以定义客户端以及它们可以访问哪些作用域。 您如何指定哪些用户可以访问特定资源?我看不出您将如何映射使用同一客户端的用户的特定权限

这些步骤将是:

  • 允许客户端访问两个作用域:“weather.api.full\u访问”、“weather.api.read\u”
  • 现在。。。。我如何授予,例如“Billy”具有“weather.api.full_访问权限”,以及“Jhon”具有“weather.api.read_只读权限”?他们使用的是同一个客户端
  • 非常感谢

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

    例如,如果您的用户可以细分为多个组织或部门,并且您希望在api中添加一个策略,以便在用户位于这些细分的组中时仅允许访问某些端点-您可以添加自定义声明
    “OrganizationID”
    “departmentid
    ”并将该声明及其值添加到已发行的令牌中。这是否适用,将取决于您的问题背景,并且当在
    身份验证
    中错误地试图解决
    授权问题时,存在一条细微的界限

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

    您不必使用UserInfo端点。您可以将客户端属性
    AlwaysIncludeUserClaimsInIdToken
    设置为true,默认情况下,所有声明都将包含在
    id\u令牌中,因此无需往返到UserInfo端点。如果您最终选择往返,您说您需要发送代表用户的
    access\u令牌
    ,这是正确的,但是,返回的不是
    id\u令牌
    ,而是用户信息。 示例来自:

    请求:获取/连接/用户信息 授权:承载{access_token}

    答复:HTTP/1.1200正常 内容类型:application/json { “sub”:“248289761001”, “姓名”:“鲍勃·史密斯”, “给定名称”:“Bob”, “姓氏”:“史密斯”, “作用”:[ “用户”, “管理员” ]}

    最后

    您如何指定哪些用户可以访问特定资源


    这很可能是通过授权来解决的,授权与OAuth2协议或IdentityServer 4无关<代码>授权
    通常在每个应用程序中根据问题域的需要进行不同的处理。我建议大家看看Identity Server的创建者。他们有一个很好的视频,深入探讨了这个主题,他们也有一个产品来解决这个问题。

    IdentityServer有三个部分:

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

    虽然IdentityServer负责对用户进行身份验证,但它还包含授权配置。您可以使用PolicyServer之类的工具将授权从IdentityServer中删除,但对于基本授权,您不必这样做

    有两种类型的用户声明:

  • 关于用户是谁的声明,如姓名、性别、生日等
  • 声明用户的权限,如角色、员工ID等
  • 第一组声明是身份令牌的一部分,告诉客户端用户是谁,其他声明是访问令牌的一部分,告诉API允许用户做什么

    关于标识令牌,唯一可以依赖的是它始终包含
    sub
    声明(用户表中的Id)。这里的filosophy的简短版本是保持标记较小,因为您所需要的只是该声明。可以在UserInfo端点请求其他信息。标识令牌的内容可能会有所不同。例如,您可以强制将所有索赔添加到第一个令牌(AlwaysIncludeUserClaimsInIdToken),以防止额外呼叫

    另一方面,如果用户选择不给予同意,则标识令牌将保持为空(子声明除外,因为scope=openid是必需的)。也可以在从UserInfo端点请求时使用

    所以问题是,你将如何使用身份令牌?令牌有多少价值?您不应该使用它来访问资源(访问令牌就是用来访问资源的),而且它可能不包含请求的信息