【问题标题】:Which layer should be used for user authentication应该使用哪一层进行用户认证
【发布时间】:2014-02-14 15:37:08
【问题描述】:

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

我有一个名为 User 的聚合根,其中包含 UserCredentialsPasswordActivationToken 等值对象. 我也很少有用于管理用户的域服务。 例如 UserRegistration 服务如下所示:

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

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

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

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

它从存储库中获取用户,检查业务规则,更新和持久化用户数据更改,如 LastLoginDate。

但是我有一些疑问,如果身份验证过程属于域本身还是应该属于应用程序服务,至于我的域,用户的身份验证方式并不重要。 但另一方面,在此服务中检查的身份验证规则属于我的域规则,因此它们是我域的组成部分。

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

【问题讨论】:

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


    【解决方案1】:

    1.一般来说,认证和授权是应用程序中的子域。你最好在应用层/核心领域建立一个抽象来隔离它们。

    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 中有很好的讨论和示例。作者单独认证到一个身份子域。

    【讨论】:

      【解决方案2】:

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

      我认为身份验证是一个业务流程。它与UserRegistrationUserStatus等概念高度耦合。

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 2011-04-19
        • 2023-03-21
        • 2014-01-24
        相关资源
        最近更新 更多