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

标签 identityserver4

忽略用户并专注于客户端 - 为了使用 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/

相关文章:

c# - IdSrv4 - 访问 token 验证器端点

asp.net-core - 如何在配置文件更新后从 Identity Server 4 刷新声明?

c# - 如何在服务器端处理新的刷新 token ?

c# - IdentityServer4 token 发行者和消费者在同一项目中

c# - .net core 3 preview 8 升级后 React SPA/Embedded Identity Server 问题

c# - 如何保留并检索外部登录提供商的access_token

c# - IdentityServer4 - 缺少来自 Google 的声明

asp.net-core-webapi - 使用身份服务器 4 和 Asp.net Core API 获得 401 未经授权的有效访问 token

oauth-2.0 - 使用身份服务器 3.0 和 oAuth 2.0 时如何跨多个应用程序(Web/移动)共享 JWT token

jwt - 承载未通过身份验证 : Signature validation failed