使用 Asp.Net Core Identity 进行干净架构的授权和身份验证

问题描述 投票:0回答:1

我是第一次学习干净和垂直切片架构,如果我们使用 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. 此场景中的用户与域逻辑紧密耦合,因此只有将身份相关实体和域实体压缩在一起时,我才能看到它工作。 数据库上下文

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

asp.net-mvc asp.net-core asp.net-identity clean-architecture
1个回答
0
投票

那么您在域层定义了授权策略吗?

您只需将域中定义的“干净”授权逻辑(策略)连接到 ASP.NET Core 授权策略,并继续使用

[Authorization]
属性。

authorizationOptions.AddPolicy(YourCleanPolicy.Name, policy =>
{
   policy.AddRequirements(new DomainPolicyRequirement(YourCleanPolicy.Name))
   //or alternatively
   policy.RequireAssertion(ctx => ...)
});

如果需要,RequirementHandler 可能会访问数据库并获取其他用户详细信息,但理想情况下,您

IPrincipal
应包含所需的所有声明。您可以通过
IClaimsTransformation

来实现这一点
© www.soinside.com 2019 - 2024. All rights reserved.