我应该在哪个ASP.NET MVC应用程序层检查成员身份信息?

chr*_*ofr 8 c# architecture membership asp.net-mvc

我有一个MVC应用程序,其结构如下(从左到右)

UI - >控制器 - >服务 - >存储器 - >数据库

我们试图让每一层与下一层分离.我们使用.NET Membership来管理安全性,我们有一个基于权限的功能,让我们说"显示我的用户类型的所有文档".

应该:

  1. Services层不了解我们的.NET成员资格提供程序?然后我们有服务层方法,看起来像"GetDocumentsByUserType(int UserTypeId){..}"?

  2. GetDocumentsByUserType()方法是否知道我们正在使用.NET Membership,使用Membership方法获取当前用户类型,并返回相关文档?

也:

  • #1是否会使我的服务层安全性降低,因为我的控制器层
    可以传递它想要的任何用户类型?
  • #2是否使我的服务层过于依赖于特定的技术,即.NET
    Membership?还有另一种方法可以考虑吗?

希望我已经提供了足够的细节.如果没有请喊,我会补充.

谢谢.

Ron*_*erg 7

您应该将所有成员资格保留在演示文稿(控制器)层中.假设您想要添加另一个表示层(或对现有图层进行更改),您将很难解决此问题.此外,您正在复制表示层和服务层之间的代码,这绝不是一个好主意.

话虽如此,没有理由不在服务层内执行安全检查,但您可以在不需要使用成员资格类的情况下执行此操作.首先,可以从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有一些缺点.首先,测试代码变得更加困难.另一个(更大的)缺点是您将角色名称硬编码到代码中.这些名称通常不归开发人员所有.

  • +1,IPrincipal是要走的路.特别是自定义IPrincipals.PrincipalPermission真的很漂亮,但是在一个项目上大量使用它我真的反对使用它 - 它对人们来说是一个地雷,真的让测试变得困难而且难以测试. (3认同)