Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Identityserver4 控制客户端访问_Identityserver4 - Fatal编程技术网

Identityserver4 控制客户端访问

Identityserver4 控制客户端访问,identityserver4,Identityserver4,我有两个不同的客户端应用程序连接到同一个API客户端。我希望其中一个具有只读访问权限(仅限Get calls),另一个能够写入(Get、Put、Post和Delete calls)。我应该如何做到这一点 最终解决方案: 这就是我最终所做的。需要注意的是,此解决方案需要额外的库 或 假设您已经编写了API,并且您与它的连接以某种方式进行了身份验证,那么您应该能够在API中查找经过身份验证的用户并验证他们的权限 在这种情况下,您可以使用作用域配置客户端访问。作用域不应用于授权,但在这种情况下,您

我有两个不同的客户端应用程序连接到同一个API客户端。我希望其中一个具有只读访问权限(仅限Get calls),另一个能够写入(Get、Put、Post和Delete calls)。我应该如何做到这一点

最终解决方案:

这就是我最终所做的。需要注意的是,此解决方案需要额外的库


假设您已经编写了API,并且您与它的连接以某种方式进行了身份验证,那么您应该能够在API中查找经过身份验证的用户并验证他们的权限

在这种情况下,您可以使用作用域配置客户端访问。作用域不应用于授权,但在这种情况下,您希望(并且可以)配置客户端对资源的访问

请注意,这不是直接授权。作用域定义了资源中的一项功能。当客户端无法请求作用域时,客户端仅限于所配置作用域的一部分功能

但这只适用于这种特殊情况,因为这只是一个客户端,没有(交互)用户参与


假设您有一个资源:
myresource

此资源有两个作用域,例如
myresource.read
myresource.write

您现在可以配置Client.AllowedScopes,其中client1具有作用域
myresource.read
,client2具有作用域
myresource.read
myresource.write

确保在资源中实现这两个作用域。您可以定义查找特定范围的策略:

services.AddAuthorization(option =>
{
    option.AddPolicy("ReadAccess", p => p.RequireScope("myresource.read"));
    option.AddPolicy("WriteAccess", p => p.RequireScope("myresource.write"));
});
并拒绝对不具有任何作用域的客户端的访问:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options =>
    {
        options.JwtBearerEvents = new JwtBearerEvents
        {
            OnTokenValidated = async context =>
            {
                var allowedScopes = new List<string> { "myresource.read" , "myresource.write" };
                if (!context.Principal.Claims.Any(c => c.Type == "scope" && allowedScopes.Contains(c.Value)))
                {
                    context.Fail("Invalid Scope");
                }
            }
        };
    });

身份验证是通过客户端凭据进行的。没有用户,没有用户。通过客户端凭据进行客户端到客户端。是的,我编写了API客户端和两个使用它的客户端应用程序。我还没有机会尝试这个,但这看起来像是我一直在寻找的答案。非常感谢。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options =>
    {
        options.JwtBearerEvents = new JwtBearerEvents
        {
            OnTokenValidated = async context =>
            {
                var allowedScopes = new List<string> { "myresource.read" , "myresource.write" };
                if (!context.Principal.Claims.Any(c => c.Type == "scope" && allowedScopes.Contains(c.Value)))
                {
                    context.Fail("Invalid Scope");
                }
            }
        };
    });
[Authorize("myresource.read")]
public class MyController : ControllerBase