忽略用户并专注于客户端 - 为了使用 ID4 保护 WebAPI 项目,您可以添加 token 身份验证中间件,然后:
.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 宿主项目。
最佳答案
让我们将资源视为需要保护的逻辑源。
这意味着资源未绑定(bind)到一个 WebApi,但 WebApi 绑定(bind)到一个资源。您可以创建一组共同构成资源的 WebApi。或者您可以简单地将完整的源代码添加到一个 WebApi。
然后将多个资源放入一个 WebApi 是没有意义的。如果它不属于资源,则创建单独的 WebApi。
但是,如果它确实属于同一个资源并且您想将资源划分为逻辑部分,那么请改用作用域。
您可以向一个资源添加多个范围:
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) 进行验证。
事件、策略、中间件可用于更细粒度的授权。
关于identityserver4 - WebAPI 项目可以托管多个 API 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934854/