控制客户端访问

时间:2020-01-08 20:20:04

标签: identityserver4

我有两个连接到同一API客户端的不同客户端应用程序。我希望其中一个具有只读访问权限(仅获取呼叫),而另一个也能够写入(获取,放置,发布和删除呼叫)。我应该如何做到这一点?

最终解决方案:

这最终就是我所做的。重要的是要注意,此解决方案需要一个附加的库。

https://www.nuget.org/packages/IdentityServer4.AccessTokenValidation/ 要么 https://github.com/IdentityServer/IdentityServer4.AccessTokenValidation

services.AddMvcCore(options =>  
{  
// require at least one of the scopes listed var policy =  
 ScopePolicy.Create("client_api_readonly", "client_api_fullaccess");  
options.Filters.Add(new AuthorizeFilter(policy));  
});  

services.AddAuthorization(option =>  
{  
// where the attribute is set, require the following scope  
option.AddPolicy("ApiFullAccess", p =>  
p.RequireScope("client_api_fullaccess"));  
});  

2 个答案:

答案 0 :(得分:1)

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

请注意,这不是直接授权。范围定义了资源中的一项功能。如果客户端无法请求范围,则客户端将被限制为已配置范围的一部分的功能。

但这仅适用于特定情况,因为这仅是一个客户端,并且不涉及(交互)用户。


假设您拥有一种资源:myresource

此资源有两个范围,例如myresource.readmyresource.write

您现在可以配置 Client.AllowedScopes ,其中 client1 具有范围myresource.read,而 client2 具有范围{{1} }和myresource.read

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

myresource.write

并拒绝访问没有任何范围的客户端:

services.AddAuthorization(option =>
{
    option.AddPolicy("ReadAccess", p => p.RequireScope("myresource.read"));
    option.AddPolicy("WriteAccess", p => p.RequireScope("myresource.write"));
});

在您的控制器中,您可以使用Authorize属性(例如,

)基于策略限制访问权限
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");
                }
            }
        };
    });

答案 1 :(得分:0)

假设您已经编写了API,并且已通过某种方式对您的连接进行了身份验证,那么您应该能够在API内查找经过身份验证的用户并验证其特权。