首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将身份验证、角色和安全性组织到DDD中?

如何将身份验证、角色和安全性组织到DDD中?
EN

Stack Overflow用户
提问于 2009-05-20 20:31:56
回答 1查看 3.5K关注 0票数 11

如何在C#域驱动的设计项目中实现角色和安全性?对于它是应该由调用应用程序(ASP.NET MVC)还是在域模型本身(模型实体和服务)中实现,我们有一些争论。有些人认为,它应该在网站本身,因为这是认证已经存在的地方。但这意味着每次与核心业务系统集成时都必须重新实现安全性。

例如,管理员应该能够在系统中执行几乎任何操作,例如编辑和删除记录(也就是说,它们可以删除用户的订单)。另一方面,用户应该只能编辑和删除自己的记录(也就是说,他们可以从购物车中添加/删除项目)。

顺便说一句,这里有一篇很好的关于这个主题的论文,它涵盖了7种关于DDD &Security的不同场景:

领域驱动设计中的安全性

  • 第4章安全服务设计场景
    • 4.1方案1:作为常规服务的安全服务
    • 4.2场景2:嵌入UI中的安全性
    • 4.3场景3:封装域模型的安全服务
    • 4.4场景4:作为UI网关的安全服务
    • 4.5场景5:作为UI适配器的安全服务
    • 4.6方案6: AOP与适配器集成的安全服务
    • 4.7方案7:与AOP集成的安全服务

我个人倾向于使用PostSharp来实现AOP,但以前并没有对它做过太多工作,所以我不太愿意采取这种做法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-20 20:51:35

不要忘记运行时已经内置了一个抽象的安全/用户系统--主体(请参阅此现有答案 --请注意,GenericIdentity只是一个选项;编写您自己的系统非常简单)。

您的UI可以根据特定的实现处理创建和分配主体(实际上,IIRC ASP.NET和WCF可以自动完成此操作,或者对于winforms/wpf您可以使用windows标识,或者(通过web服务)使用相同的ASP.NET登录名)。

然后,您的业务逻辑只检查Thread.CurrentPrincipal;由此您可以获得名称、身份验证方法和角色检查(而不需要知道角色是如何实现的)。

运行时还提供内置的检查:

代码语言:javascript
复制
    [PrincipalPermission(SecurityAction.Demand, Role = Roles.Admin)]
    public void Foo() {...}

(其中Roles.Admin是角色名称的字符串常量)这将自动检查访问,如果不在角色中则抛出一个SecurityException。您还可以通过代码进行检查(如果在编译时没有固定角色,则非常有用)。

显然,您的UI应该检查角色(以禁用/隐藏功能),但是让业务代码强制执行角色而不需要了解UI是很好的。

(加)

我应该指出,GenericIdentity对于单元测试来说非常方便。当然,你可以使用你自己的安全API,没有人会阻止你.

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/890085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档