【发布时间】:2022-06-13 00:01:58
【问题描述】:
我是第一次学习清洁和垂直切片架构,如果我们使用 ASP.NET Core Identity,我无法理解授权和身份验证的适用范围。此外,感觉好像在某些情况下,将身份用户(使用用户名、密码、电子邮件等)与任何与用户相关的域实体分开会很棘手。
例如,如果我们有一个使用 ASP.NET Core MVC、ASP.NET Core Identity 的解决方案,那么示例项目结构可能如下所示:
演示/WebUI 项目:
- cshtml 视图/Razor 页面以及控制器(如果不使用 Razor 页面)将存在于此。
- 此项目的 program/startup.cs 是可以调用其他层的扩展方法的地方:
app.services.InjectInfrastructure(); // same for application
基础设施项目:
- 应用层合同的实现。
- 数据库上下文。
- 如果您正在使用它们,可能是存储库的实现。
应用项目:
- 命令/查询(假设使用 MassTransit.Mediator 或 MediatR 之类的东西)。
- 验证器(例如流畅的验证)。
领域项目:
- 领域实体(贫血或遵循 DDD 的方法)。
- 任何聚合、值对象等(如果使用)。
因此,我们可以有一个具有以下流程的场景:
- 调用控制器操作以获取一些数据(表示应用层查询),该操作返回呈现的 html(cshtml 视图)。
- 在此 html 页面上填充数据,并将 POST 请求(代表应用层命令)发送到控制器操作。
- 使用 MediatR 发送命令或查询。
- 命令处理程序运行(具有数据访问权限,例如 dbcontext 或存储库),它验证、对数据进行适当的更改并返回响应。
- 向控制器返回响应,然后控制器可以确定命令/查询是否成功
- 控制器重定向到另一个操作或填充 ModelState 错误。
我很难区分身份验证问题的情况是,系统中的用户具有不同的角色和权限,具体取决于他们在登录时所做的选择。
例如,教师可以选择他们当前代表的学校的教育应用程序。在一所学校,他们可能担任某种角色(例如校长),而在另一所学校,他们可能担任特权较低的角色。
在这样的场景中,角色、应用程序用户(两者都是身份问题)似乎与域紧密耦合(该域将容纳不同的学校和每个学校拥有的角色)。
我的首要问题是,我们如何以简洁的架构方式使用 ASP.NET 身份实现这种身份验证/授权场景?
目前这种情况存在多个问题:
- 如果我们要将身份验证/授权与表示层分离,我们不能依赖控制器上的 [Authorize(Role = "X")] [Authorize(Policy = "Y")] 装饰器,因为这个逻辑应该委托给基础设施 (以确保如果我们想在任何时候交换表示层,我们不需要重写身份验证/授权)
- 此场景中的用户与域逻辑紧密耦合,因此我只能看到与身份相关的实体和域实体被压缩在一起才能工作 dbContext
有没有人遇到过/使用干净的架构实现过这样的系统?任何人对此有任何见解都会很棒!
【问题讨论】:
-
您能否分享一下您的应用程序遇到的问题和复杂性?此外,您是否关注任何示例或官方文档?
标签: asp.net-mvc asp.net-core asp.net-identity clean-architecture