忽略用户并专注于客户端-为了保护具有ID4的WebAPI项目,您可以添加令牌身份验证中间件,然后:
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
是否可以使用相同的WebAPI项目来保护其他API?
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api2";
});
或者ResourceAPI和“ WebAPI宿主项目”之间的比例是1:1?
基本上,在客户端级别,我很好奇您是否可以为不同的客户端创建多个API但使用相同的WebAPI宿主项目。
答案 0 :(得分:3)
让我们将资源视为需要保护的逻辑源。
这意味着该资源未绑定到一个WebApi,但是WebApi被绑定到一个资源。您可以创建一组WebApi,它们一起构成资源。或者,您可以将完整的源代码简单地添加到一个WebApi中。
然后将多个资源放入一个WebApi中是没有意义的。如果它不属于资源,则创建单独的WebApi。
但是,如果它确实属于同一资源,并且您希望将资源划分为逻辑部分,请改用 scopes 。
您可以将多个范围添加到一个资源:
resource = Api0
scope = Api1.Read
scope = Api1.Write
scope = Api2.Read
scope = Api2.Write
请注意,我使用“ 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;
}
};
});
当一个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"));
});
可以在哪里使用AuthorizeAttribute:
[Authorize("Api1.Read")]
请注意,范围!=资源。客户端请求一个或多个范围,例如"Api1.Read Api1.Write"
,但资源已通过名称(audience = Api0)进行验证。
事件,策略,中间件可以用于更细粒度的授权。