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

时间:2011-10-06 11:17:57

标签: c# asp.net-mvc architecture membership

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

用户界面 - >控制器 - >服务 - >储存 - > DATABASE

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

应:

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

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

  3. 此外:

    • #1是否使我的服务层不那么安全,就像我的控制器层一样 可以传递任何它想要的UserType?
    • #2是否使我的服务层过于依赖于特定的技术,即.NET 会员?还有另一种方法可以考虑吗?

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

    感谢。

1 个答案:

答案 0 :(得分:7)

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

话虽如此,没有理由不在服务层内执行安全检查,但是您可以在不需要使用成员资格类的情况下执行此操作。首先,当前经过身份验证的用户可从Thread.CurrentPrincipal获得(在服务层方法中)。您可以使用此IPrincipal执行安全检查。

其次,您可以使用PrincipalPermissionAttribute对服务层方法或类强制执行安全规则。例如:

[PrincipalPermission(SecurityAction.Demand, Role="Administrator")]
public void MySecureServiceLayerMethod()
{
    var p = Thread.CurrentPrincipal;
    ....
}

要使角色工作正常,您还必须使用RoleProvider实施。

更新:正如Wyatt Barnett在评论中解释的那样,使用PrincipalPermission有一些缺点。首先,测试代码变得更加困难。另一个(更大的)缺点是您将角色名称硬编码到代码中。这些名称通常不归开发者所有。