【问题标题】:Controlling Client Access控制客户端访问
【发布时间】:2020-01-15 00:38:58
【问题描述】:

我有两个不同的客户端应用程序连接到同一个 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"));  
});  

【问题讨论】:

  • 身份验证是通过客户端凭据进行的。没有用户。

标签: identityserver4


【解决方案1】:

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

请注意,这不是直接授权。范围定义资源中的一项功能。当客户端无法请求范围时,客户端将仅限于配置的范围内的功能。

但这仅适用于这种特殊情况,因为这只是一个客户端,不涉及(交互式)用户。


假设您有一个资源:myresource

这个资源有两个作用域,例如myresource.readmyresource.write

您现在可以配置 Client.AllowedScopes,其中 client1 的范围为 myresource.readclient2 的范围为 myresource.read 和 @987654326 @。

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

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");
                }
            }
        };
    });

在您的控制器中,您可以根据策略限制访问,使用 Authorize 属性,例如

[Authorize("myresource.read")]
public class MyController : ControllerBase

【讨论】:

  • 我还没有机会尝试这个,但这看起来就像我正在寻找的答案。谢谢!
【解决方案2】:

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

【讨论】:

  • 没有用户。通过客户端凭据的客户端到客户端。是的,我编写了 API 客户端和使用它的两个客户端应用程序。
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 2018-02-08
  • 2022-01-11
  • 2018-08-31
  • 2014-02-12
  • 2015-07-15
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多