gpt4 book ai didi

c# - 我应该检查我的 ASP.NET MVC 应用程序的哪一层成员信息?

转载 作者:太空狗 更新时间:2023-10-29 19:26:35 24 4
gpt4 key购买 nike

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

UI -> Controller -> 服务 -> 存储库 -> 数据库

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

应该:

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

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

还有:

  • #1 是否降低了我的服务层的安全性,因为我的 Controller 层
    可以作为 UserType 传递任何它想要的东西吗?
  • #2 是否使我的服务层过于依赖特定技术,即 .NET
    成员(member)资格?这里还有其他方法可以考虑吗?

希望我已经提供了足够的细节。如果没有请大声,我会添加。

谢谢。

最佳答案

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

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

其次,您可以使用 PrincipalPermissionAttribute在您的服务层方法或类上实现安全规则。例如:

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

要使角色内容起作用,您还必须使用 RoleProvider实现。

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

关于c# - 我应该检查我的 ASP.NET MVC 应用程序的哪一层成员信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com