Ocelot支持在运行时通过一个认证的Http API修改配置。有两种方式对其验证, 使用Ocelot的内置IdentityServer(仅用于向管理API验证请求)或将管理API验证挂接到您自己的IdentityServer中。

提供你自己的 IdentityServer

挂接到你自己的IdentityServer,你只需要添加一下代码到你的ConfigureServices 方法中。

public virtual void ConfigureServices(IServiceCollection services)
{
    Action<IdentityServerAuthenticationOptions> options = o => {
            // o.Authority = ;
            // o.ApiName = ;
            // etc....
        };

    services
        .AddOcelot()
        .AddAdministration("/administration", options);
}

您现在需要从你的IdentityServer获取令牌,并在后续请求Ocelot的管理API时使用。

这个功能是对问题 228 的实现。这个功能很有用,因为IdentityServer认证中间件需要IdentityServer的URL。 如果您使用内置IdentityServer,则可能无法获得Ocelot URL。

内置 IdentityServer

管理API使用您从Ocelot请求的持票人令牌进行身份验证。这是由我已经使用了几年的非常了不起的Identity Server项目提供的。 您可以去看一下。

为了启用管理部分,您需要做一些操作。 首先将此添加到您的初始化文件Startup.cs中。

管理路径可以是任何值,显然不能使用将要通过Ocelot路由的url,因为这是行不通的。管理功能使用asp.net core的MapWhen功能,并且所有到{root} /administration的请求将被发送到那里,而不是Ocelot中间件。

secret是Ocelot内置IdentityServer用于验证对管理API请求的客户端密钥。你可以随意填写!

public virtual void ConfigureServices(IServiceCollection services)
{
    services
        .AddOcelot()
        .AddAdministration("/administration", "secret");
}

现在,如果您使用上述配置选项并想要访问API,可以使用解决方案中名为ocelot.postman_collection.json的postman脚本来更改Ocelot配置。 显然,如果Ocelot运行在不同与http://localhost:5000的URL上,则需要改一下。

这些脚本向您展示了如何从ocelot请求bearer令牌,然后使用它来获取现有配置和修改配置。

如果您在群集中运行多个Ocelot,则需要使用证书对用于访问管理API的bearer令牌签名。

为了做到这一点,您需要为集群中的每个Ocelot再添加两个的环境变量。

OCELOT_CERTIFICATE
用于签名令牌的证书路径。 证书必须是X509类型,显然Ocelot要能够访问它。

OCELOT_CERTIFICATE_PASSWORD
证书的密码。

通常Ocelot只使用临时签名凭证,但如果您设置了这些环境变量,那么它将使用设置的证书。 如果集群中的所有其他Ocelot都具有相同的证书,那很棒,这样就对了!

管理 API

POST {adminPath}/connect/token

这会使用我们上面讨论的客户端证书得到一个用于管理区域的令牌。 在这种情况下,这将调用Ocelot中托管的IdentityServer。

请求体是from-data,允许一下数据:

client_id 设置为admin

client_secret 设置为您在设置管理服务时使用的内容

scope 设置为admin

grant_type 设置为client_credentials

GET {adminPath}/configuration

获得当前的Ocelot配置。 这与我们先前设置Ocelot的JSON完全相同。

POST {adminPath}/configuration

这会覆盖现有的配置(可能应该是put更合适!)。 我建议用GET获取您的配置,进行更改后使用此api发回...。

这个请求体的JSON,格式和我们使用文件系统设置Ocelot的 FileConfiguration.cs格式相同

DELETE {adminPath}/outputcache/{region}

这将清空特定区域的缓存。如果您使用空白region,它将清除缓存的所有实例!赋予您运行Ocelots集群,并将其全部缓存在内存中,并同时清除所有缓存(仅使用分布式缓存)的能力。

region是您在Ocelot配置的FileCacheOptions部分中针对region字段设置的内容。

04-14 11:31