如何根据OR规则授权用户访问资源

时间:2017-12-12 14:55:41

标签: c# asp.net-core authorization asp.net-core-2.0

情景:

我有复杂的WebApi应用程序。在控制器中,我想根据以下业务规则授权用户访问指定的资源:

要访问资源,用户必须

  • 经过身份验证

  • 是资源的作者或者是资源的赞助商或者是管理员角色

和 - 基于资源类型和行动的其他规则

问题:

如何组织和配置策略,要求和RequirementHandler以满足此规则(带OR条件)?

我知道授权API的设计是为了能够处理任何场景,但我需要策略,以便在复杂和不断变化的场景中保持可读性和可读性。

这是我最初的尝试:

  • 我创建了IsAuthorRequirement和通用处理程序,可以处理所有资源的这个要求。
  • 我有IsSponsorRequirement和多个处理程序,因为每种资源类型都必须以不同的方式处理。

我最初的想法是为每个资源和行动创建自定义策略,例如:

  • CanReadResource1Policy
  • CanEditResouce1Policy
  • CanReadResouce2Policy
  • CanEditResource2Policy

换句话说,每个权限的政策。

public async Task<ActionResult> GetById(int id)
{
   var resource = _dbContext.Resources1.Find(id);

   var authResult = await _authorizationService.AuthorizeAsync(User, resource, Policies.CanReadResouce1);
   if (!authResult.Succeeded) return Forbid();
}

但是现在我觉得我在某种程度上与框架作斗争而且我滥用政策/要求。例如,默认情况下,策略要求所有要求都成功,但我的业务规则具有OR条件。我知道多个需求处理程序会创建事实上的OR条件,但是我应该使用它来在我的buseness规则中创建OR条件吗?

0 个答案:

没有答案