基于角色的业务层授权
问题描述:
我有一个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);
}
优点
- 容易进行单元测试,因为角色被明确传递给方法
缺点
- 每一个方法都需要有一个参数
- 如果授权基于角色的授权变更为任何形式的授权,它打破了系统
什么是另类?在业务层中实现基于角色的授权的标准方式是什么?
答
有一种标准的方式实现外化,跨多个层次的细粒度授权(不只是基于角色)。该模型被称为abac并代表基于属性的访问控制。有一个实现它的主要框架,称为xacml。另一种选择是在.Net中基于声明的授权。
ABAC/XACML定义:
- ,用以限定授权规则例如策略语言
a manager can view documents they own
。 -
一种架构,一方面定义了
a。其处理授权请求,并且产生一个决策策略决策点(PDP)(允许/拒绝)
湾一个保护您的应用程序,拦截业务请求并向PDP发送授权请求的策略执行点(PEP)。这是一段代码,将在您的应用程序坐在无论是作为一个过滤器,拦截器,注释或更多...
与外部化授权的很好的做法是,你可以应用在多个层相同一致的授权(从Web SSO到业务层甚至数据层)。
HTH。*上有很多资源。你也可以看看这个blog我试图保持最新。