我有两个连接到同一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"));
});
答案 0 :(得分:1)
在这种情况下,您可以使用范围配置客户端访问。作用域不应用于授权,但在这种情况下,您需要(并且可以)配置客户端对资源的访问。
请注意,这不是直接授权。范围定义了资源中的一项功能。如果客户端无法请求范围,则客户端将被限制为已配置范围的一部分的功能。
但这仅适用于特定情况,因为这仅是一个客户端,并且不涉及(交互)用户。
假设您拥有一种资源:myresource
。
此资源有两个范围,例如myresource.read
和myresource.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内查找经过身份验证的用户并验证其特权。