我是第一次学习干净和垂直切片架构,如果我们使用 ASP.NET Core Identity,我很难理解授权和身份验证的适用范围。而且,在某些情况下,感觉将身份用户(使用用户名、密码、电子邮件等)与任何用户相关的域实体分开会很棘手。
例如,如果我们有一个使用 ASP.NET Core MVC、ASP.NET Core Identity 的解决方案,那么示例项目结构可能如下:
演示/WebUI 项目:
app.services.InjectInfrastructure(); // same for application
基础设施项目:
应用项目:
域项目:
因此,我们可以有一个具有以下流程的场景:
我很难分离身份验证问题的情况是系统中的用户根据他们在登录时所做的选择具有不同的角色和权限。
例如,一个教育应用程序,教师可以选择他们当前代表的学校。在一所学校,他们可能担任某种角色(例如校长),而在另一所学校,他们可能担任特权较小的角色。
在这样的场景中,角色、应用程序用户(都是身份问题)似乎与域紧密耦合(其中包含每个学校拥有的不同学校和角色)。
我的首要问题是,我们如何以干净的架构方式使用 ASP.NET 身份来实现这种身份验证/授权场景?
目前这种情况带来了多个问题:
有没有人曾经遇到过/使用干净的架构实现过这样的系统?任何人对此有任何见解都会很棒!
那么您在域层定义了授权策略吗?
您只需将域中定义的“干净”授权逻辑(策略)连接到 ASP.NET Core 授权策略,并继续使用
[Authorization]
属性。
authorizationOptions.AddPolicy(YourCleanPolicy.Name, policy =>
{
policy.AddRequirements(new DomainPolicyRequirement(YourCleanPolicy.Name))
//or alternatively
policy.RequireAssertion(ctx => ...)
});
如果需要,RequirementHandler 可能会访问数据库并获取其他用户详细信息,但理想情况下,您
IPrincipal
应包含所需的所有声明。您可以通过 IClaimsTransformation
来实现这一点