Identityserver4 WebAPI项目能否承载多个API?
忽略用户,关注客户机-为了使用ID4保护WebAPI项目,您可以添加令牌身份验证中间件,然后:Identityserver4 WebAPI项目能否承载多个API?,identityserver4,Identityserver4,忽略用户,关注客户机-为了使用ID4保护WebAPI项目,您可以添加令牌身份验证中间件,然后: .AddIdentityServerAuthentication(options => { options.Authority = "http://localhost:5000"; options.RequireHttpsMetadata = false; options.A
.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主机项目让我们考虑一个资源是一个需要保护的逻辑源。 这意味着资源没有绑定到一个WebApi,但是WebApi绑定到一个资源。您可以创建一组共同构成资源的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"));
});
您可以在其中使用authorized属性:
[Authorize("Api1.Read")]
请注意范围!=资源。客户端请求一个或多个作用域,例如“Api1.Read Api1.Write”
,但资源是通过名称验证的(访问群体=Api0)
事件、策略、中间件可用于更细粒度的授权。什么是
RequireScope
的名称空间?@Sasan添加IdentityServer4.AccessTokenValidation
包,名称空间Microsoft.AspNetCore.authorization
。谢谢我使用了policy.RequireScope(“scope”,“value}”)