忽略用户并专注于客户端-为了保护具有ID4的WebAPI项目,您可以添加令牌身份验证中间件,然后:
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
Run Code Online (Sandbox Code Playgroud)
是否可以使用相同的WebAPI项目来保护其他API?
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api2";
});
Run Code Online (Sandbox Code Playgroud)
还是ResourceAPI和“ WebAPI宿主项目”之间的比例是1:1?
基本上,在客户端级别,我很好奇您是否可以为不同的客户端创建多个API但使用相同的WebAPI宿主项目。
让我们将资源视为需要保护的逻辑源。
这意味着该资源未绑定到一个WebApi,但是WebApi被绑定到一个资源。您可以创建一组WebApi,它们一起构成资源。或者,您可以将完整的源代码简单地添加到一个WebApi中。
然后,将多个资源放入一个WebApi中是没有意义的。如果它不属于资源,则创建单独的WebApi。
但是,如果它确实属于同一资源,并且您希望将资源分成逻辑部分,则可以使用范围。
您可以将多个范围添加到一个资源:
resource = Api0
scope = Api1.Read
scope = Api1.Write
scope = Api2.Read
scope = Api2.Write
Run Code Online (Sandbox Code Playgroud)
请注意,我使用“ Api0”作为资源名称(options.ApiName)。其中ApiX可能是每个客户端的逻辑分区。
现在,我可以创建单独的WebApi,它们是同一资源(都具有options.ApiName = "Api0")或一个WebApi的一部分。
在单独的Api的情况下,每个Api都实现一个作用域,我可以这样使用:
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "Api0";
options.JwtBearerEvents = new JwtBearerEvents
{
OnTokenValidated = context =>
{
if (!context.Principal.HasClaim("scope", "Api1.Read"))
context.Fail("Invalid Scope");
return Task.CompletedTask;
}
};
});
Run Code Online (Sandbox Code Playgroud)
当一个WebApi具有多个作用域时,我可以使用策略:
services.AddMvcCore()
...
.AddAuthorization(p =>
{
p.AddPolicy("Api1.Read", (policy) => policy.RequireScope("Api1.Read"));
p.AddPolicy("Api1.Write", (policy) => policy.RequireScope("Api1.Write"));
p.AddPolicy("Api2.Read", (policy) => policy.RequireScope("Api2.Read"));
p.AddPolicy("Api2.Write", (policy) => policy.RequireScope("Api2.Write"));
});
Run Code Online (Sandbox Code Playgroud)
在哪里可以使用AuthorizeAttribute:
[Authorize("Api1.Read")]
Run Code Online (Sandbox Code Playgroud)
请注意,范围!=资源。客户端请求一个或多个范围,例如"Api1.Read Api1.Write",但是资源通过名称(audience = Api0)进行了验证。
事件,策略,中间件可用于更细粒度的授权。
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |