【问题标题】:Authorization and Authentication with Clean Architecture using Asp.Net Core Identity使用 Asp.Net Core Identity 的 Clean Architecture 授权和身份验证
【发布时间】: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 的方法)。
  • 任何聚合、值对象等(如果使用)。

因此,我们可以有一个具有以下流程的场景:

  1. 调用控制器操作以获取一些数据(表示应用层查询),该操作返回呈现的 html(cshtml 视图)。
  2. 在此 html 页面上填充数据,并将 POST 请求(代表应用层命令)发送到控制器操作。
  3. 使用 MediatR 发送命令或查询。
  4. 命令处理程序运行(具有数据访问权限,例如 dbcontext 或存储库),它验证、对数据进行适当的更改并返回响应。
  5. 向控制器返回响应,然后控制器可以确定命令/查询是否成功
  6. 控制器重定向到另一个操作或填充 ModelState 错误。

我很难区分身份验证问题的情况是,系统中的用户具有不同的角色和权限,具体取决于他们在登录时所做的选择。

例如,教师可以选择他们当前代表的学校的教育应用程序。在一所学校,他们可能担任某种角色(例如校长),而在另一所学校,他们可能担任特权较低的角色。

在这样的场景中,角色、应用程序用户(两者都是身份问题)似乎与域紧密耦合(该域将容纳不同的学校和每个学校拥有的角色)。

我的首要问题是,我们如何以简洁的架构方式使用 ASP.NET 身份实现这种身份验证/授权场景?

目前这种情况存在多个问题:

  1. 如果我们要将身份验证/授权与表示层分离,我们不能依赖控制器上的 [Authorize(Role = "X")] [Authorize(Policy = "Y")] 装饰器,因为这个逻辑应该委托给基础设施 (以确保如果我们想在任何时候交换表示层,我们不需要重写身份验证/授权)
  2. 此场景中的用户与域逻辑紧密耦合,因此我只能看到与身份相关的实体和域实体被压缩在一起才能工作 dbContext

有没有人遇到过/使用干净的架构实现过这样的系统?任何人对此有任何见解都会很棒!

【问题讨论】:

  • 您能否分享一下您的应用程序遇到的问题和复杂性?此外,您是否关注任何示例或官方文档?

标签: asp.net-mvc asp.net-core asp.net-identity clean-architecture


【解决方案1】:

我有销售问题。你找到解决办法了吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2021-01-07
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2016-08-31
    相关资源
    最近更新 更多