为了验证Routes
并随后使用Ocelot
的任何基于声明的功能,如授权或使用令牌中的值修改请求。 用户必须像往常一样在他们的Startup.cs
中注册认证服务,但他们给每个注册提供了一个方案(认证提供商密钥),例如
public void ConfigureServices(IServiceCollection services)
{
var authenticationProviderKey = "TestKey";
services.AddAuthentication()
.AddJwtBearer(authenticationProviderKey, x =>
{
});
}
在此示例中,TestKey
是此提供程序已注册的方案。 然后,我们将其映射到配置中的Route
,例如
"Routes": [{
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51876,
}
],
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": ["Post"],
"RouteIsCaseSensitive": false,
"DownstreamScheme": "http",
"AuthenticationOptions": {
"AuthenticationProviderKey": "TestKey",
"AllowedScopes": []
}
}]
当Ocelot
运行时,它会查看此Routes
的AuthenticationOptions
.AuthenticationProviderKey
并检查是否存在给定密钥注册的身份验证提供程序。 如果没有,那么Ocelot
不会启动,如果有的话Route
将在执行时使用该提供者。
如果Route
配置了认证,Ocelot
在执行认证中间件时将调用与其相关的任何验证方案。 如果请求认证失败,Ocelot
返回http
状态码401
。
JWT令牌
如果您想使用JWT
令牌进行身份验证,例如Auth0
等提供商,您可以使用正常的方式注册你的身份验证中间件。
public void ConfigureServices(IServiceCollection services)
{
var authenticationProviderKey = "TestKey";
services.AddAuthentication()
.AddJwtBearer(authenticationProviderKey, x =>
{
x.Authority = "test";
x.Audience = "test";
});
services.AddOcelot();
}
然后将身份验证提供程序密钥映射到配置中的Route
,例如
"Routes": [{
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51876,
}
],
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": ["Post"],
"RouteIsCaseSensitive": false,
"DownstreamScheme": "http",
"AuthenticationOptions": {
"AuthenticationProviderKey": "TestKey",
"AllowedScopes": []
}
}]
Identity Server 承载令牌
为了使用IdentityServer
承载令牌,请按照惯例在ConfigureServices
中使用方案(密钥)注册您的IdentityServer
服务。 如果您不明白如何操作,请访问IdentityServer
文档。
public void ConfigureServices(IServiceCollection services)
{
var authenticationProviderKey = "TestKey";
Action<IdentityServerAuthenticationOptions> options = o =>
{
o.Authority = "https://whereyouridentityserverlives.com";
o.ApiName = "api";
o.SupportedTokens = SupportedTokens.Both;
o.ApiSecret = "secret";
};
services.AddAuthentication()
.AddIdentityServerAuthentication(authenticationProviderKey, options);
services.AddOcelot();
}
然后将身份验证提供程序密钥映射到配置中的Route,例如
"Routes": [{
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51876,
}
],
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": ["Post"],
"RouteIsCaseSensitive": false,
"DownstreamScheme": "http",
"AuthenticationOptions": {
"AuthenticationProviderKey": "TestKey",
"AllowedScopes": []
}
}]
Okta
Add the following to your startup Configure method:
将以下内容添加到您的启动Configure
方法中:
app
.UseAuthentication()
.UseOcelot()
.Wait();
至少将以下内容添加到启动的ConfigureServices
方法中:
services
.AddAuthentication()
.AddJwtBearer(oktaProviderKey, options =>
{
options.Audience = configuration["Authentication:Okta:Audience"]; // Okta Authorization server Audience
options.Authority = configuration["Authentication:Okta:Server"]; // Okta Authorization Issuer URI URL e.g. https://{subdomain}.okta.com/oauth2/{authidentifier}
});
services.AddOcelot(configuration);
注意:为了使Ocelot可以正确地查看Okta
的范围声明,您必须添加以下内容以将默认的Okta
“scp”声明映射到“scope”
// Map Okta scp to scope claims instead of http://schemas.microsoft.com/identity/claims/scope to allow ocelot to read/verify them
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("scp");
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Add("scp", "scope");
发行446,其中包含一些可能有助于Okta
集成的代码和示例。
允许的范围
如果将范围添加到AllowedScopes
,Ocelot
将获得类型范围的所有用户声明(从令牌中),并确保用户具有列表中的所有范围。
这是一种基于范围限制对Route
访问的方式。
Ocelot支持基于声明的授权,该授权在身份验证后运行。 这意味着,如果您有要授权的路由,则可以在路由配置中添加以下内容。
"RouteClaimsRequirement": {
"UserType": "registered"
}
在此示例中,当调用授权中间件时,Ocelot将检查用户是否具有声明类型UserType
以及该声明的值是否已注册。 如果不是,则将不授权用户,并且响应将被禁止403。