C# 应使用哪一层进行用户身份验证

C# 应使用哪一层进行用户身份验证,c#,authentication,domain-driven-design,domain-service-class,C#,Authentication,Domain Driven Design,Domain Service Class,我打算在我的一个应用程序中使用域驱动设计,但对用户身份验证有一些疑问 我有一个名为User的聚合根目录,它有值对象,如UserCredentials、Password、ActivationToken等。 我也很少有用于管理用户的域服务。 例如,用户注册服务如下所示: public interface IUserRegistrationService { IEnumerable<string> Register(NewUserRequest request); } 公共接口I

我打算在我的一个应用程序中使用域驱动设计,但对用户身份验证有一些疑问

我有一个名为User的聚合根目录,它有值对象,如UserCredentialsPasswordActivationToken等。 我也很少有用于管理用户的域服务。 例如,用户注册服务如下所示:

public interface IUserRegistrationService
{
    IEnumerable<string> Register(NewUserRequest request);
}
公共接口IUserRegistrationService
{
IEnumerable寄存器(NewUserRequest);
}
它检查分配给用户注册过程的业务规则,并将用户持久化到数据库中

现在我想对用户进行身份验证,所以我创建了用户身份验证域服务:

public interface UserAuthenticationService
{
    IEnumerable<string> Authenticate(AuthRequest request);
}
公共接口UserAuthenticationService
{
IEnumerable身份验证(AuthRequest);
}
它从存储库中提取用户,检查业务规则,更新并持久化用户数据更改,如LastLoginDate

但我怀疑身份验证过程是否属于域本身,还是应该属于应用程序服务,至于我的域,不管用户如何被身份验证。 但另一方面,在该服务中检查的身份验证规则属于我的域规则,因此它们是我的域不可分割的一部分


那么,在基于DDD的应用程序中,您将身份验证放在何处?您对此问题的解决方案是什么?

1。通常,身份验证和授权是应用程序中的su域。您最好在应用层/核心域中构建一个抽象来隔离它们

public interface OrderingService// application layer
{
    void PlaceOder(Order order) {
          //delegate to identity subdomain to validate user request
          UserAuthenticationService.Authenticate(ExtractFrom(order));

          //delegate to booking core domain to handle core business 
          BookingService.placeOrder(order);
    }
}
2.在身份子域中,认证算法可以放在基础架构层:

public class OathUserAuthenticationService:UserAuthenticationService //infrastructure layer
{
    IEnumerable<string> Authenticate(AuthRequest request) {
         ......
    }
}
公共类OathUserAuthenticationService:UserAuthenticationService//基础架构层
{
IEnumerable身份验证(AuthRequest){
......
}
}

中有非常好的讨论和示例。作者将身份验证与身份子域分开。

以下答案在很大程度上取决于我对您的任务和环境的假设,所以不要盲目相信我

我认为身份验证是一个业务流程。它与
用户
注册
用户状态
等概念高度结合

如果你问我如何用一个词来调用这个业务流程,我会选择
UserPolicy
。将
UserPolicy
视为聚合根。它的边界包括这样的实体:
用户
注册服务
认证服务
用户存储库
。所有这些都必须保持一致。这很容易实现,因为他们的每一个动作都要经过他们的根实体:

IUserPolicy up = container.Resolve<IUserPolicy>();

up.RegisterUser(newUserRequest);

up.AuthUser(authRequest);
IUserPolicy up=container.Resolve();
up.RegisterUser(newUserRequest);
up.AuthUser(authRequest);