【问题标题】:Role based authorization in Business layer业务层中基于角色的授权
【发布时间】:2017-04-09 08:54:45
【问题描述】:

我有一个 3 层应用程序 - 1) UI 层是一个 ASP .NET MVC 应用程序 2) 业务层是一个类库 3) 数据访问层是一个类库。我使用了基于声明的基于角色的授权。我在 Application_AuthenticateRequest 事件处理程序中设置声明

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
            var authenticationCookie = 
    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

            var ticket = FormsAuthentication.Decrypt(authenticationCookie.Value);
            FormsIdentity formsIdentity = new FormsIdentity(ticket);
            ClaimsIdentity claimsIdentity = new ClaimsIdentity(formsIdentity);
           // Get the roles from database
              ... 
             var role = GetUserRole();      
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, role));

            ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
            Thread.CurrentPrincipal = claimsPrincipal;  
}

现在我有两种方法可以访问业务层中的角色

1) 直接从 Thread 主体访问角色

var principal = Thread.CurrentPrincipal as ClaimsPrincipal;
   var claim = principal.Claims.FirstOrDefault(x => x.Type == 
   ClaimTypes.Role);

优点:

  • 每个方法都可以隐式访问角色。

缺点

  • 难以进行单元测试,因为它依赖于静态对象

2) 将角色作为参数传递给需要它的方法,例如

 public IUserService {

    void CreateUser(User user, string role);
   }

优点

  • 易于单元测试,因为角色已显式传递给方法

缺点

  • 每个方法都需要有一个参数
  • 如果授权从基于角色的授权更改为任何形式的授权,都会破坏系统

有什么选择?在业务层实现基于角色的授权的标准方式是什么?

【问题讨论】:

    标签: c# asp.net-mvc authorization claims-based-identity


    【解决方案1】:

    有一种跨多个层实施外部化细粒度授权(不仅仅是基于角色)的标准方法。该模型称为,代表基于属性的访问控制。有一个实现它的主要框架,称为。另一种选择是 .Net 中基于声明的授权。

    ABAC/XACML 定义:

    1. 一种用于定义授权规则的策略语言,例如a manager can view documents they own
    2. 一方面定义的架构

      一个。处理授权请求并产生决策(允许/拒绝)的策略决策点 (PDP)

      b.保护您的应用程序、拦截业务请求并将授权请求发送到 PDP 的策略执行点 (PEP)。这是一段代码,可以作为过滤器、拦截器、注释或更多功能存在于您的应用程序中......

    使用外部授权的好方法是您可以一次性在多个层(从 Web SSO 到业务层甚至数据层)应用相同的一致授权。

    HTH。维基百科上有很多资源。你也可以看看这个blog 我尽量保持最新。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2018-04-17
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2017-04-12
      • 2018-07-21
      相关资源
      最近更新 更多