entity-framework - POCO + 具有存储库模式的 Entity Framework - 权限处理

标签 entity-framework permissions authorization repository-pattern poco

我有一个包含 3 层的应用程序:
用户界面 : 在 ASP.NET MVC 中实现
商务 :持有业务逻辑和资源访问控制
存储库 (DAL) :使用存储库模式使用 POCO 对象和 EF 实现。我的 POCO 对象与上层共享。

我对 POCO 应该拥有哪些信息/方法有疑问?
即:如果我有一个包含用户用户名和密码的用户表,我的 POCO 应该有什么?我应该如何验证密码?我的 POCO 是否应该有一种方法要求存储库进行验证?

另外,我应该如何控制对我的资源的访问?我的存储库是否应该控制谁可以和不可以访问资源?这仍然让我的 POCO 使用导航属性公开信息。如果当前用户也可以使用它们,我应该检查 POCO 属性吗?

提前致谢。

最佳答案

我有一个类似的项目,我可以给你一些关于我如何执行类似操作的细节。我假设您的整个解决方案都是基于 .Net 的。

POCO(Plain Old CLR Objects)就是没有业务逻辑的对象。因此,密码验证不应直接在该类中,而应在您的业务层中。例如,UI 会调用 Controller 操作将数据提交给业务层(BL),BL 会通过调用存储库来执行用户密码验证以获取当前存储/加密的密码,BL 将比较密码并返回一个结果到您的 UI 或采取一些其他措施。当然,所有数据也应该经过验证,以防止 SQL 注入(inject)或跨站点脚本攻击等事情。

您的 POCO 可以具有 Uid/Pwd 属性。你应该在你的应用层之间传递这个 POCO 对象。因此,MVC UI 将绑定(bind)到您的用户对象,并且在提交时, Controller 将调用您的 BL 中的某个方法并在该用户对象上执行和业务规则(密码有效)。为了在实际层之间传递这些,您需要从主 DAL 中提取这些 POCO,并将它们放在单独的组件中。这些对象通常被称为域对象,您可以谷歌域驱动开发以获取有关该方法的更多信息。

安全性可以在应用程序中以几种不同的方式实现,这完全取决于您想要覆盖的项目的深度。 MVC 中最基本的方法是在您的 Controller 类上使用 Authorize 属性(谷歌:保护您的 Controller 操作)。当您的用户通过身份验证时,可以为他们分配某种类型的应用程序角色,您可以使用以下格式验证用户是否具有这些角色之一:

[Authorize(Roles = "ModifyUserRoles")]
        public ActionResult About()
        {
}

关于entity-framework - POCO + 具有存储库模式的 Entity Framework - 权限处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3547111/

相关文章:

c# - 如何在 EF 中选择按日期分组的多个计数

entity-framework - 在 EF4.3 中的 Code First Approach 中为列设置十进制(16, 3)

asp.net - Entity Framework : how to solve "FOREIGN KEY constraint may cause cycles or multiple cascade paths"?

java - JavaEE/JaaS 的属性/域安全性?

c# - 如何避免 IntelliTrace 事件中截断的 EF 查询?

javascript - .deny Meteor 使用..无法让它工作

windows - 在本地事件目录上不能嵌套另一个组的组成员

Android 请求不需要的权限

ruby-on-rails - rails 应用程序 : Links to Devise views route to the home page.

c# - Windows 窗体应用程序的身份验证和授权的任何框架?