我的ASP的哪一层?. NET MVC应用程序,我应该检查会员信息



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

UI -> controller -> SERVICES -> repository -> DATABASE

我们试图保持每一层与下一层解耦。我们使用。net Membership来管理安全性,我们有一个基于权限的函数,比如"显示我的用户类型的所有文档"

:

  1. 服务层没有意识到我们的。net会员提供商?然后我们有服务层的方法,看起来像"GetDocumentsByUserType(int UserTypeId){..}"?

  2. GetDocumentsByUserType()方法要知道,我们正在使用。net会员,使用会员方法来获得当前的用户类型,并返回相关的文档?

:

  • 是否#1使我的服务层不那么安全,作为我的控制器层
    可以传递任何它想要的UserType吗?
  • #2是否使我的服务层过于依赖于特定的技术,即。net ?会员?这里有别的方法可以考虑吗?

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

谢谢。

你应该把所有的成员属性放在表示(控制器)层中。假设您想要添加另一个表示层(或对现有层进行更改),您将很难解决这个问题。此外,您在表示层和服务层之间复制代码,这绝不是一个好主意。

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

第二,你可以使用PrincipalPermissionAttribute在你的服务层方法或类上强制安全规则。例如:

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

要使角色工作,还必须使用RoleProvider实现。

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

最新更新