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