WebAPI项目可以托管多个API吗?

时间:2018-10-22 17:39:04

标签: identityserver4

忽略用户并专注于客户端-为了保护具有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宿主项目。

1 个答案:

答案 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)进行验证。

事件,策略,中间件可以用于更细粒度的授权。