应该使用哪个层进行用户身份验证

时间:2014-02-12 14:17:21

标签: c# authentication domain-driven-design domain-service-class

我想在我的某个应用程序中使用域驱动设计,并对用户身份验证有疑问。

我有一个名为用户的聚合根,其中包含 UserCredentials 密码 ActivationToken 等值对象等。 我也没有很少的域服务来管理用户。 例如, UserRegistration 服务如下所示:

public interface IUserRegistrationService
{
    IEnumerable<string> Register(NewUserRequest request);
}

它检查分配给用户注册过程的业务规则,并在数据库中保留用户。

现在我想对用户进行身份验证,因此我创建了 UserAuthentication 域名服务:

public interface UserAuthenticationService
{
    IEnumerable<string> Authenticate(AuthRequest request);
}

它从存储库中获取用户,检查业务规则,更新并保留用户数据更改,如LastLoginDate。

但我有一些疑问,如果身份验证过程属于域本身,或者它应该属于应用程序服务,就我的域而言,用户的身份验证方式无关紧要。 但另一方面,在此服务中检查的身份验证规则属于我的域规则,因此它们是我域中不可或缺的一部分。

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

2 个答案:

答案 0 :(得分:2)

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.在Identity子域中,身份验证算法可以放在基础架构层中:

public class OathUserAuthenticationService:UserAuthenticationService //infrastructure layer
{
    IEnumerable<string> Authenticate(AuthRequest request) {
         ......
    }
}

Implementing Domain Driven Design中有很好的讨论和例子。作者将身份验证分配给身份子域。

答案 1 :(得分:1)

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

我认为身份验证是一个业务流程。它与UserRegistrationUserStatus

的概念高度耦合

如果您问我如何使用单个单词来调用此业务流程,我会选择UserPolicy。将UserPolicy视为聚合根。它的边界包括以下实体:UserRegistrationServiceAuthenticationServiceUserRepository。所有这些都必须保持一致。它很容易实现,因为与它们的每个动作都是通过它们的根实体:

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

up.RegisterUser(newUserRequest);

up.AuthUser(authRequest);