Identityserver4 WebAPI项目能否承载多个API?

Identityserver4 WebAPI项目能否承载多个API?,identityserver4,Identityserver4,忽略用户,关注客户机-为了使用ID4保护WebAPI项目,您可以添加令牌身份验证中间件,然后: .AddIdentityServerAuthentication(options => { options.Authority = "http://localhost:5000"; options.RequireHttpsMetadata = false; options.A

忽略用户,关注客户机-为了使用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主机项目 因此,将多个资源放在一个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}”)