我有一个MVC应用程序,其结构如下(从左到右)
用户界面 - >控制器 - >服务 - >储存 - > DATABASE
我们试图让每一层与下一层分离。我们使用.NET Membership来管理安全性,我们有一个基于权限的功能,假设“显示我的用户类型的所有文档”。
应:
服务层不了解我们的.NET成员资格提供程序?然后我们有服务层方法,看起来像“GetDocumentsByUserType(int UserTypeId){..}”?
GetDocumentsByUserType()方法是否知道我们正在使用.NET Membership,使用Membership方法获取当前用户类型,并返回相关文档?
此外:
希望我已经提供了足够的细节。如果没有请喊,我会补充。
感谢。
答案 0 :(得分:7)
您应该将所有会员资料保留在演示文稿(控制器)层中。假设您想要添加另一个表示层(或对现有图层进行更改),您将很难解决此问题。此外,您正在复制表示层和服务层之间的代码,这绝不是一个好主意。
话虽如此,没有理由不在服务层内执行安全检查,但是您可以在不需要使用成员资格类的情况下执行此操作。首先,当前经过身份验证的用户可从Thread.CurrentPrincipal
获得(在服务层方法中)。您可以使用此IPrincipal
执行安全检查。
其次,您可以使用PrincipalPermissionAttribute
对服务层方法或类强制执行安全规则。例如:
[PrincipalPermission(SecurityAction.Demand, Role="Administrator")]
public void MySecureServiceLayerMethod()
{
var p = Thread.CurrentPrincipal;
....
}
要使角色工作正常,您还必须使用RoleProvider
实施。
更新:正如Wyatt Barnett在评论中解释的那样,使用PrincipalPermission
有一些缺点。首先,测试代码变得更加困难。另一个(更大的)缺点是您将角色名称硬编码到代码中。这些名称通常不归开发者所有。