2017-04-09 90 views
1

我有一个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); 

优点:

  • 每种方法c隐式地访问该角色。

缺点

  • 难单元测试,因为它是依赖静态对象

2)上作为参数传递给该方法需要它例如作用

public IUserService { 

    void CreateUser(User user, string role); 
    } 

优点

  • 容易进行单元测试,因为角色被明确传递给方法

缺点

  • 每一个方法都需要有一个参数
  • 如果授权基于角色的授权变更为任何形式的授权,它打破了系统

什么是另类?在业务层中实现基于角色的授权的标准方式是什么?

回答

0

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

ABAC/XACML定义:

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

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

    湾一个保护您的应用程序,拦截业务请求并向PDP发送授权请求的策略执行点(PEP)。这是一段代码,将在您的应用程序坐在无论是作为一个过滤器,拦截器,注释或更多...

与外部化授权的很好的做法是,你可以应用在多个层相同一致的授权(从Web SSO到业务层甚至数据层)。

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

The XACML Architecture