我的ASP的哪一层?. NET MVC应用程序,我应该检查会员信息
本文关键字:应用程序 MVC NET 我应该 员信息 检查 一层 ASP 我的 | 更新日期: 2023-09-27 18:10:30
我有一个MVC应用程序,其(简化)结构如下(从左到右)
UI -> controller -> SERVICES -> repository -> DATABASE
我们试图保持每一层与下一层解耦。我们使用。net Membership来管理安全性,我们有一个基于权限的函数,比如"显示我的用户类型的所有文档"。
:
-
服务层没有意识到我们的。net会员提供商?然后我们有服务层的方法,看起来像"GetDocumentsByUserType(int UserTypeId){..}"?
-
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
有一些缺点。首先,测试代码变得更加困难。另一个(更大的)缺点是将角色名称硬编码到代码中。这些名称通常不属于开发人员。