Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于声明的授权_C#_.net_Asp.net Core_Jwt_Identityserver4 - Fatal编程技术网

C# 基于声明的授权

C# 基于声明的授权,c#,.net,asp.net-core,jwt,identityserver4,C#,.net,Asp.net Core,Jwt,Identityserver4,我有一位用户声称: 角色:[“管理员”、“测试人员”] 我希望控制器方法只能使用角色声明值“Admin”进行访问。 为此,我添加了如下策略: services.AddAuthorization(options => { options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin")); }); 并在我

我有一位用户声称:
角色:[“管理员”、“测试人员”]

我希望控制器方法只能使用角色声明值“Admin”进行访问。 为此,我添加了如下策略:

services.AddAuthorization(options => {
            options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
        });
并在我的控制器方法的顶部添加了
[Authorize(Policy=“Admin”)]
属性

不幸的是,启动应用程序时,用户没有访问权限

如果我从他的声明中删除角色
Tester
,这样他只有Admin(
role:“Admin”
),并且不再是数组,那么他确实有访问权限

据我所知,策略应该像“包含”一样检查,但不知何故,这似乎不起作用


我做错什么了吗?

你可能理解不正确。一个声明最多有六个参数,每个参数对应一个不同的函数,而不是一个数组。这是源代码

public Claim(string type, string value, string valueType, string issuer, string originalIssuer, ClaimsIdentity subject);
您可以逐个添加这些声明

    var claims = new List<Claim>
            {
                
                new Claim("role","Tester"),
                new Claim("role","Admin"),
            };
var索赔=新列表
{
新索赔(“角色”、“测试人员”),
新声明(“角色”、“管理员”),
};
索赔可以存储多个相同的索赔类型


另外,您也可以参考这一点。

您可能没有正确理解它。一个声明最多有六个参数,每个参数对应一个不同的函数,而不是一个数组。这是源代码

public Claim(string type, string value, string valueType, string issuer, string originalIssuer, ClaimsIdentity subject);
您可以逐个添加这些声明

    var claims = new List<Claim>
            {
                
                new Claim("role","Tester"),
                new Claim("role","Admin"),
            };
var索赔=新列表
{
新索赔(“角色”、“测试人员”),
新声明(“角色”、“管理员”),
};
索赔可以存储多个相同的索赔类型


另外,您可以参考这个。

您是否尝试过
policy.RequireRole()
很好的调用,我还没有尝试过。不幸的是,它仍然不起作用:-(这可能值得一读。你能告诉我们你是如何向你的用户添加声明的吗,代码如下:
新声明(ClaimTypes.Role,“Admin”,ClaimValueTypes.String);
你试过
policy.RequireRole()
好的调用,我还没有试过。不幸的是,它仍然不起作用:-(这可能值得一读,你能告诉我们你是如何向你的用户添加声明的吗,代码如下:
新声明(ClaimTypes.Role,“Admin”,ClaimValueTypes.String);
是的,我就是这样做的,我添加了多个这样的角色:
新声明(JwtClaimTypes.Role,“Admin”),新声明(JwtClaimTypes.Role,“Tester”),
不,它没有回答我的问题,我从一开始就这样,它不起作用是的,但不可能实现你所描述的多重角色。除了这种方法,你可以接受什么方法来实现?你能更清楚地描述它吗?是的,我就是这样做的,我添加了多重角色,如:
新声明(JwtClaimTypes.Role,“Admin”),新声明(JwtClaimTypes.Role,“Tester”),
不,它没有回答我的问题,我从一开始就这样,它不起作用是的,但不可能实现您所描述的多重角色。除了这种方法,您可以接受哪些方法来实现?您能更清楚地描述它吗?