Identityserver4 使用identity server 4和客户端凭据授予类型的基于角色的访问

Identityserver4 使用identity server 4和客户端凭据授予类型的基于角色的访问,identityserver4,role-base-authorization,role-based-access-control,clientcredential,Identityserver4,Role Base Authorization,Role Based Access Control,Clientcredential,我刚从Identity Server 4开始 我正在尝试使用客户端凭据授予类型保护API 我在IS4中有一个API设置: public static IEnumerable<ApiResource> Apis => new List<ApiResource> { new ApiResource("myapi", "Test API") { Api

我刚从Identity Server 4开始

我正在尝试使用客户端凭据授予类型保护API

我在IS4中有一个API设置:

    public static IEnumerable<ApiResource> Apis =>
        new List<ApiResource> 
        {
            new ApiResource("myapi", "Test API")
            {
                ApiSecrets = { new Secret("secret".Sha256() )}
            }
        };
如果我随后创建一个令牌请求,如下所示:

        var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
        {
            Address = disco.TokenEndpoint,
            ClientId = "testc",
            ClientSecret = "m2msecret",
            Scope = "myapi",
        });
这允许我调用API并访问资源。太好了

但是,我想用一个角色来保护控制器,例如

[Authorize(Roles = "admin")]
public class TestController : ControllerBase {} 
所以我的两个问题是:


1:如何使用客户端凭据设置基于角色的授权

2:由于客户端凭据未链接到用户,我如何保留记录更改的审核跟踪,例如,供应商X由用户ID 5更新,等等


谢谢,我明白你的意思了。但是客户机不是用户,所以您不能将角色分配给客户机

让我们后退一步。资源是您想要保护的。在IdentityServer中,您可以为资源指定一个逻辑名称,这是因为您可以拥有多个属于同一资源的api。而且,不太明显的是,资源至少有一个作用域。在示例中,资源的名称为“Api1”,作用域为“Api1”

客户端只有在至少配置了一个允许的作用域时才能访问资源。因为它是用于访问资源的api名称

要基于作用域限制访问,必须测试令牌中包含的作用域。这是关键,您不应该使用角色,而应该使用在范围上匹配的策略。在您的启动中:

services.AddAuthorization(option =>
{
    option.AddPolicy("testing", p => p.RequireScope("myapp.test"));
});
在控制器中:

[Authorize("testing")]
public class TestController : ControllerBase {} 
请注意:不受上述策略保护的部分将允许至少具有一个资源作用域的所有客户端,无论它是哪个作用域

我建议您将资源拆分为逻辑部分(作用域),并配置客户端以定义哪个客户端可以访问哪个作用域(资源的一部分)

客户机的类型无关紧要。这适用于客户端凭据授予类型,但也适用于交互式客户端。尽管在这种情况下,用户授权可以重新获得访问权限

至于跟踪用户。对于交互式客户端,用户可在子声明中使用。通过用户授权,您可以使用角色

对于客户端凭据流,此类信息应该是请求(数据)的一部分


对于您的设计,您可以为不同类型的客户端和用户授权使用单独的控制器,这些客户端和用户授权可以调用相同的服务。

1:如何使用客户端凭据设置基于角色的授权? 2:由于客户端凭据未链接到用户,我如何保留记录更改的审核跟踪,例如,供应商X由用户ID 5更新,等等

具体而言,用户授权和客户端凭据之间存在差异。用户授权是API将验证的内容。客户端凭据用于访问另一个服务。您不会使用自己的客户端凭据访问自己的服务

对于特定的实现,您可能需要生成许多符合特定权限情况的策略:

services.AddAuthorization(选项=>
{
option.AddPolicy(“PoliyExample”,p=>p.Require(…);
});

然而,这并不总是最好的。通常,最好将用户标识令牌传递给授权服务器,以显式处理该验证。这样一来,你就可以避免一开始就需要一个客户ID和一个秘密。由于您的用户已经通过身份验证,所以只需调用进行验证的授权微服务。(例如,对于IdentityServer,您可能会使用类似或的角色。

角色仅对用户有意义,但客户端凭据流中没有用户。实际上,该流仅用于“机器到机器通信”。在这种情况下,更新是由进程进行的,那么用户ID 5来自何处?看起来您确实有用户,但t您使用了错误的流程。流程应该更合适。谢谢您的回复。我以5为例。该系统由不同的供应商使用。一些供应商将使用M2M访问该系统,另一些将使用web客户端访问该系统。至于角色,我们有不同类型的M2M供应商,我希望不同供应商有不同的访问权限如果我想指定角色,请告诉我。谢谢你的回复。让我试试这个。谢谢。我已经把这个和你的答案结合起来了。
services.AddAuthorization(option =>
{
    option.AddPolicy("testing", p => p.RequireScope("myapp.test"));
});
[Authorize("testing")]
public class TestController : ControllerBase {}