如何 add/check 策略和角色 .net core API 使用 Identityserver4 进行保护
How to add/check policy and role .net core API securing with Identityserver4
我对 API 使用身份服务器 4
进行保护有疑问
IdentityResource
Name
Claims
Roles
role
API资源
Name
Scopes
testapi
api1
API作用域
Name
Claims
api1
address
在Startup.cs
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddJwtBearer("Bearer", opt =>
{
opt.Audience = "testapi";
opt.Authority = "https://localhost:5001";
opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateAudience = true
};
});
//Policy "Apiscope" created
services.AddAuthorization(opt =>
{
opt.AddPolicy("Apiscope", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("Scope", "api1");
});
});
services.AddAuthorization(opt =>
{
opt.AddPolicy("AdminUsers", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("admin");
});
});
在控制器中
[HttpPost]
[Authorize(Policy = "AdminUsers")]
public IActionResult GetAdminMessage()
{
return Ok("Hello Admin");
}
- 是否可以在 .Net Core 中访问身份范围 API?如果是,怎么办?
- 要获取角色值,我是否需要添加 API“api1”用户声明的范围作为“地址,角色”或 可以通过上面的方式完成第一季度?
- 在策略“AdminUser”中,我通过将“api1”(APIScopes) 用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?
是否可以在 .Net Core 中访问身份范围 API?如果是,怎么办?
IdentityResources 中的声明进入 ID-Token。当您登录客户端 (AddOpenIDConnect) 时,ID-Token 的内容被“转换”为 ClaimsPrincipal 用户对象。之后不使用 ID 令牌。
要获取角色值,我需要添加 API“api1”用户声明的范围作为“地址,角色”还是可以通过上面的 Q1 完成?
API范围在 API 侧。 API's 接收访问令牌,它包含来自 ApiSCopes 和 ApiResources 的用户声明。 access-token中的claims被转换为API中的用户对象(使用AddJwtBearer),你可以使用AddPolicy系统来授权用户。
在策略“AdminUser”中,我通过将“api1”(API范围)用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?
ASP.NET Core 和 IdentityServer 对声明类型(名称)应该是什么有不同的看法,所以你需要告诉 AddJwtBearer 你的角色声明的真实名称是什么,使用:
.AddJwtBearer(opt =>
{
...
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
您也可以在 ConfigureServices 方法的顶部添加:
public void ConfigureServices(IServiceCollection services)
{
// By default, Microsoft has some legacy claim mapping that converts
// standard JWT claims into proprietary ones. This removes those mappings.
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
如果这没有帮助,您也可以尝试添加:
options.ClaimActions.MapUniqueJsonKey("role", "role");
我对 API 使用身份服务器 4
进行保护有疑问IdentityResource
Name | Claims |
---|---|
Roles | role |
API资源
Name | Scopes |
---|---|
testapi | api1 |
API作用域
Name | Claims |
---|---|
api1 | address |
在Startup.cs
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddJwtBearer("Bearer", opt =>
{
opt.Audience = "testapi";
opt.Authority = "https://localhost:5001";
opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateAudience = true
};
});
//Policy "Apiscope" created
services.AddAuthorization(opt =>
{
opt.AddPolicy("Apiscope", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("Scope", "api1");
});
});
services.AddAuthorization(opt =>
{
opt.AddPolicy("AdminUsers", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("admin");
});
});
在控制器中
[HttpPost]
[Authorize(Policy = "AdminUsers")]
public IActionResult GetAdminMessage()
{
return Ok("Hello Admin");
}
- 是否可以在 .Net Core 中访问身份范围 API?如果是,怎么办?
- 要获取角色值,我是否需要添加 API“api1”用户声明的范围作为“地址,角色”或 可以通过上面的方式完成第一季度?
- 在策略“AdminUser”中,我通过将“api1”(APIScopes) 用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?
是否可以在 .Net Core 中访问身份范围 API?如果是,怎么办?
IdentityResources 中的声明进入 ID-Token。当您登录客户端 (AddOpenIDConnect) 时,ID-Token 的内容被“转换”为 ClaimsPrincipal 用户对象。之后不使用 ID 令牌。
要获取角色值,我需要添加 API“api1”用户声明的范围作为“地址,角色”还是可以通过上面的 Q1 完成?
API范围在 API 侧。 API's 接收访问令牌,它包含来自 ApiSCopes 和 ApiResources 的用户声明。 access-token中的claims被转换为API中的用户对象(使用AddJwtBearer),你可以使用AddPolicy系统来授权用户。
在策略“AdminUser”中,我通过将“api1”(API范围)用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?
ASP.NET Core 和 IdentityServer 对声明类型(名称)应该是什么有不同的看法,所以你需要告诉 AddJwtBearer 你的角色声明的真实名称是什么,使用:
.AddJwtBearer(opt =>
{
...
opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";
您也可以在 ConfigureServices 方法的顶部添加:
public void ConfigureServices(IServiceCollection services)
{
// By default, Microsoft has some legacy claim mapping that converts
// standard JWT claims into proprietary ones. This removes those mappings.
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
如果这没有帮助,您也可以尝试添加:
options.ClaimActions.MapUniqueJsonKey("role", "role");