C# 应使用哪一层进行用户身份验证
我打算在我的一个应用程序中使用域驱动设计,但对用户身份验证有一些疑问 我有一个名为User的聚合根目录,它有值对象,如UserCredentials、Password、ActivationToken等。 我也很少有用于管理用户的域服务。 例如,用户注册服务如下所示: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
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);