【问题标题】:Same Policy but different required parameter for each action method每个操作方法的策略相同但所需参数不同
【发布时间】:2019-01-30 21:20:37
【问题描述】:

在.Net core Webapi 2.1 项目中,我有大量的操作方法。
所有操作方法都应根据相同的策略(名为 FooPolicy)进行授权,但需要使用不同的参数。
基于微软的文档:Policy-based-Authorization 一种方法是根据不同的输入参数声明大量策略:

services.AddAuthorization(options =>
{
    options.AddPolicy("FooPolicy1", policy =>policy.Requirements.Add(new FooRequirement(1)));
    options.AddPolicy("FooPolicy2", policy =>policy.Requirements.Add(new FooRequirement(2)));
    options.AddPolicy("FooPolicy3", policy =>policy.Requirements.Add(new FooRequirement(3)));
    //... May be 30 more same policies here ...
});

正如我之前提到的,new FooRequirement(diffArgs) 中只有不同的部分。此解决方案的另一个挑战是在其相应的操作方法上添加每个 FooPolicy,您可能会错过几个主题:

[Authorize(Policy = "FooPolicy1")]
public IActionResult ActionMethodFoo1(...) {...}

[Authorize(Policy = "FooPolicy2")]
public IActionResult ActionMethodFoo2(...) {...}

[Authorize(Policy = "FooPolicy3")]
public IActionResult ActionMethodFoo3(...) {...}
...List still goes on...

是否有类似的解决方案: 声明一次策略,但将其与 FooRequirement 的不同实例(类型为 IAuthorizationHandler)一起使用?像这样:

services.AddAuthorization(options =>
{
    options.AddPolicy("FooPolicy", policy =>policy.Requirements.Add(?));
});

关于动作方法:

[Authorize(Policy = "FooPolicy", required = new FooRequirement(1))]
public IActionResult ActionMethodFoo1(...) {...}

[Authorize(Policy = "FooPolicy", required = new FooRequirement(2))]
public IActionResult ActionMethodFoo2(...) {...}

[Authorize(Policy = "FooPolicy", required = new FooRequirement(3))]
public IActionResult ActionMethodFoo3(...) {...}

主要思想是声明一次政策。最近的两个代码块是psudo-code,有没有人知道类似概念的实际解决方案?

【问题讨论】:

    标签: asp.net-core-webapi asp.net-authorization policy-based-security


    【解决方案1】:

    你可以实现自己的IAuthorizationFilter

    1. 自定义IAuthorizationFilter

      public class CustomAuthorize : IAuthorizationFilter         
       {
              private readonly int _input;
      
      public CustomAuthorize(int input)
      {
          _input = input;
      }
      
      public void OnAuthorization(AuthorizationFilterContext context)
      {
          //custom validation rule
          if (_input == 1)
          {
              context.Result = new ForbidResult();
          }
      }
      }
      
    2. 自定义CustomAuthorizeAttribute

      public class CustomAuthorizeAttribute : TypeFilterAttribute
      {
      public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize))
      {
          Arguments = new object[] { input };
      }
      }
      
    3. 使用

      [CustomAuthorizeAttribute(1)]
      public IActionResult About()
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2020-04-30
      • 2021-03-05
      相关资源
      最近更新 更多