如何使用声明(角色)设置 Ocelot?
How to set up Ocelot with claims (roles)?
我正在尝试在 Api 网关中设置 Ocelot,但我卡在了授权上。我已经设法设置声明,并且可以在我的控制器中授权它们。我向这样的用户添加声明:
await userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, configuration["InitialAdmin:Role"]));
然后我使用以下配置设置 Ocelot:
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/home/user",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/user",
"RouteClaimsRequirement": {
"Role": "user"
}
},
{
"DownstreamPathTemplate": "/api/home/admin",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/admin",
"RouteClaimsRequirement": {
"Role": "SuperAdmin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000"
}
}
这是我的 ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddIdentity<CondatoUser, IdentityRole>(options =>
{
//Signin config
options.SignIn.RequireConfirmedEmail = true;
//Password config
options.Password.RequiredLength = 8;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
//User config
options.User.RequireUniqueEmail = true;
})
.AddDefaultUI()
.AddEntityFrameworkStores<UserManagementDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOcelot(Configuration);
}
然后我登录到此网关 Api(这是一个 MVC 项目,login/register/etc 默认为 UI。)并尝试访问以下 URL:
https://localhost:5000/api/home/admin
但是,我总是返回 403 状态。当我删除 RouteClaimsRequirement
时,它起作用了。所以我想我遗漏了一些东西,但我不知道 RouteClaimsRequirement
的文档有点稀疏。
有人可以帮我吗?谢谢。
事实证明,使用 System.Security.Claims
中的预定义 ClaimTypes
无法完成此操作。这是因为 (app)settings json 解析无法处理字典键中的冒号 (:)。参考 Ocelot 存储库中的 this issue。
解决方案是使用自定义声明类型,例如"Role" 而不是 System.Security.Claims.Role
,这会产生“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”
我正在尝试在 Api 网关中设置 Ocelot,但我卡在了授权上。我已经设法设置声明,并且可以在我的控制器中授权它们。我向这样的用户添加声明:
await userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, configuration["InitialAdmin:Role"]));
然后我使用以下配置设置 Ocelot:
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/home/user",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/user",
"RouteClaimsRequirement": {
"Role": "user"
}
},
{
"DownstreamPathTemplate": "/api/home/admin",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/api/home/admin",
"RouteClaimsRequirement": {
"Role": "SuperAdmin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000"
}
}
这是我的 ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddIdentity<CondatoUser, IdentityRole>(options =>
{
//Signin config
options.SignIn.RequireConfirmedEmail = true;
//Password config
options.Password.RequiredLength = 8;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
//User config
options.User.RequireUniqueEmail = true;
})
.AddDefaultUI()
.AddEntityFrameworkStores<UserManagementDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddOcelot(Configuration);
}
然后我登录到此网关 Api(这是一个 MVC 项目,login/register/etc 默认为 UI。)并尝试访问以下 URL:
https://localhost:5000/api/home/admin
但是,我总是返回 403 状态。当我删除 RouteClaimsRequirement
时,它起作用了。所以我想我遗漏了一些东西,但我不知道 RouteClaimsRequirement
的文档有点稀疏。
有人可以帮我吗?谢谢。
事实证明,使用 System.Security.Claims
中的预定义 ClaimTypes
无法完成此操作。这是因为 (app)settings json 解析无法处理字典键中的冒号 (:)。参考 Ocelot 存储库中的 this issue。
解决方案是使用自定义声明类型,例如"Role" 而不是 System.Security.Claims.Role
,这会产生“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”