Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# 访问/保护Restful服务oAuth2_C#_Asp.net Web Api_Oauth 2.0_Identityserver4 - Fatal编程技术网

C# 访问/保护Restful服务oAuth2

C# 访问/保护Restful服务oAuth2,c#,asp.net-web-api,oauth-2.0,identityserver4,C#,Asp.net Web Api,Oauth 2.0,Identityserver4,我正在尝试编写一个Restful服务,它有多个端点,比如 假设每个端点调用都由一个角色保护 GetEmployees(角色/声明=Employee.Readonly或Employee.Edit或Employee.Admin) AddEmployee(角色/索赔=Employee.Edit或Employee.Admin) UpdateEmployee(角色/索赔=Employee.Edit或Employee.Admin) DeleteEmployee(角色/索赔=Employee.Admin) 对

我正在尝试编写一个Restful服务,它有多个端点,比如

假设每个端点调用都由一个角色保护

  • GetEmployees(角色/声明=Employee.Readonly或Employee.Edit或Employee.Admin)
  • AddEmployee(角色/索赔=Employee.Edit或Employee.Admin)
  • UpdateEmployee(角色/索赔=Employee.Edit或Employee.Admin)
  • DeleteEmployee(角色/索赔=Employee.Admin)
  • 对于隐式流,只需检查角色声明,我们就完成了。

    我的困惑在于客户端凭据流,这里如何将作用域映射到角色?

    让我们假设客户端凭据方法存在以下情况:

    var client = new TokenClient(
                BaseAddress + "/connect/token",
                "clientId",
                "clientSecret");
    
    var result = client.RequestClientCredentialsAsync(scope: "my.api").Result;
    
    var accessToken = result.AccessToken;
    
    var client = new HttpClient();
    client.SetBearerToken(accessToken);
    var result = client.GetStringAsync("https://protectedapiaddress/api/data/getdata").Result;
    
    其中BaseAddress是您的ID地址

    当然,您必须使用适当的流(客户机凭据)在IDS客户机列表中注册您的客户机,范围只是可选的,但我想您需要一个

    然后在API方面,您可以使用新的

    API方法:

    [HttpGet]
    [Authorize(Policy = "AdminUser")]
    [Route("getdata")]
    public Data GetData()
    {
      // some code here
    }
    
    以及授权要求:

    public class AdminUserRequirement : AuthorizationHandler<AdminUserRequirement>, IAuthorizationRequirement
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminUserRequirement requirement)
        {
            if (!context.User.HasClaim(<'Your rule'>))
            {
                context.Fail();
            }
            else
            {
                context.Succeed(requirement);
            }
            return Task.FromResult(0);
        }
    }
    
    还有更多。然后你可以应用规则

    编辑:忘记提及-您必须在Startup.cs中注册策略

    public void ConfigureServices(IServiceCollection services)
    {
        services
                .AddMvcCore()
                .AddAuthorization(options =>
                {
                        options.AddPolicy("AdminUser",
                        policy => policy.Requirements.Add(new AdminUserRequirement()));
                });
    
        // More code here
    
    }
    

    使用策略或角色只是语法的改变。范围“my.api”如何转化为策略?如果我们按照您的方式合并我的示例,我将有3种策略,即只读、用户、管理员用户。在requirement类中,我将寻找确切的声明,但范围如何转化为策略?我并不是说范围转化为策略。我只是说,您将在声明中拥有作用域和clientid,因为对于客户端凭据流,您所拥有的只是这些,您可以在策略中使用它们来允许/拒绝访问。在策略上更像是自定义授权属性。是的,如果你这样做,你将需要为每个不同的角色制定不同的政策。很多人不喜欢它,这是一种开销,但微软。。。
    public void ConfigureServices(IServiceCollection services)
    {
        services
                .AddMvcCore()
                .AddAuthorization(options =>
                {
                        options.AddPolicy("AdminUser",
                        policy => policy.Requirements.Add(new AdminUserRequirement()));
                });
    
        // More code here
    
    }