1

我正在綁定在我的一個應用程序中使用域驅動設計,並對用戶驗證有一些疑問。應使用哪一層進行用戶驗證

我有一個叫用戶具有價值對象,如UserCredentials密碼ActivationToken等 我也有一個管理用戶數域服務的總根源。 例如放在userRegistration服務看起來是這樣的:

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

它檢查分配給用戶的註冊過程,並在數據庫中保持用戶的業務規則。

現在我想驗證用戶,所以我創建UserAuthentication域名服務:

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

它需要用戶從資源庫中,檢查業務規則,更新和持續像LastLoginDate用戶數據的變化。

但我有一些懷疑,如果身份驗證過程屬於域本身或它應該屬於應用程序服務,至於我的域,它並不重要如何用戶進行身份驗證。 但另一方面,在此服務中檢查的身份驗證規則屬於我的域規則,因此它們是我的域的組成部分。

那麼你在哪裏把認證放在你的基於DDD的應用中,你對這個問題的解決方案是什麼?

回答

2

1.通常,認證和授權是應用程序中的su-domains。你最好在應用層/核心域中構建一個抽象來隔離它們。

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.In標識子域,認證算法可以被放置在基礎設施層:

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

有優良的討論和Implementing Domain Driven Design例子。作者將身份驗證分爲一個身份子域。

1

以下的答案很大程度上取決於我對你的任務和環境的假設,所以不要盲目地相信我。

我認爲認證是一個業務流程。它的高度再加User概念,RegistrationUserStatus

如果你問我如何調用同一個單詞此業務流程,我會選擇UserPolicy。查看UserPolicy作爲聚合根。它的邊界包括這樣的實體:User,RegistrationService,AuthenticationService,UserRepository。他們都必須保持一致。這很容易實現,因爲他們的每一個動作都經歷了他們的根本實體:

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

up.RegisterUser(newUserRequest); 

up.AuthUser(authRequest);