2011-07-11 239 views
5

我正在關注專業ASP.NET設計模式中的案例研究Scott Millet。在案例研究中,認證在基礎設施項目中處理。它包含像AspFormsAuthentication這樣的實現:IFormsAuthentication,AspMembershipAuthentication:ILocalAuthenticationService。DDD身份驗證服務

這很好,因爲他使用內置的成員資格提供程序,但是,我不是,所以我需要訪問我的資料庫。在我的場景中,將我的ILocalAuthenticationService和AspMembershipAuthentication實現放置在Services項目中不是更好嗎?

我問這個別處,有人回答說:

我還是會放的功能拉憑據在基礎設施層,因爲這層垂直對齊到另一個水平層和所有層訪問它。由於您沒有使用ASP.NET成員資格提供程序,並且可能正在使用可能只使用加密憑據的自定義內容,因此仍然可以使用基礎結構層來包裝這些憑據的訪問權限,並允許存儲庫在需要時使用它們。您可以讓服務層獲取並傳遞它們,但是您有太多的層瞭解數據將如何被檢索/保留,以及需要什麼授權訪問,這在嘗試分層和分離問題時是不好的。

太好了。這是有道理的。但我不知道該從哪裏出發。從案例研究中的代碼:

public class AspMembershipAuthentication : ILocalAuthenticationService 
{ 
    public User Login(string email, string password) 
    { 
     User user = new User(); 
     user.IsAuthenticated= false; 

     if (Membership.ValidateUser(email, password)) 
     { 
      MembershipUser validatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = validatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 

     return user; 
    } 

    public User RegisterUser(string email, string password) 
    {    
     MembershipCreateStatus status; 
     User user = new User(); 
     user.IsAuthenticated = false; 

     Membership.CreateUser(email, password, email, 
           Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), 
           true, out status); 

     if (status == MembershipCreateStatus.Success) 
     { 
      MembershipUser newlyCreatedUser = Membership.GetUser(email); 
      user.AuthenticationToken = newlyCreatedUser.ProviderUserKey.ToString(); 
      user.Email = email; 
      user.IsAuthenticated = true; 
     } 
     else 
     { 
      switch (status) 
      { 
       case MembershipCreateStatus.DuplicateEmail: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.DuplicateUserName: 
        throw new InvalidOperationException(
          "There is already a user with this email address."); 
       case MembershipCreateStatus.InvalidEmail: 
        throw new InvalidOperationException(
          "Your email address is invalid"); 
       default: 
        throw new InvalidOperationException(
        "There was a problem creating your account. Please try again."); 
      } 
     } 

     return user; 
    }  
} 

如果我不使用成員資格提供,我如何連接到數據庫來檢查用戶名和密碼匹配,其他可能的檢查項目之中?

+1

認證是應用程序級別的問題。它不是你的域名的一部分。 – jfar

回答

3

在您的基礎架構層中創建一個實現ILocalAuthenticationService的類並進行所需的調用。

或者,如果ILocalAuthenticationService太ASP.NET-y(使用它的用戶返回類型),您可能需要推出自己的ILocalAuthenticationService變體並實現該變體。

然後在您需要時使用您的IoC容器來解析ILocalAuthenticationService。

+0

感謝您的回覆。我的基礎設施層已經具有ILocalAuthenticationService,與上面類似,實現AspMembershipAuthentication。我上面發佈的實現使用默認的成員資格提供程序,而我不打算使用它。因此,從基礎架構層中,我將如何訪問數據以執行像上述實現對會員供應商所做的那樣的檢查? – getoutofmylaboratory

+0

我明白了 - 所以您的基礎架構層無法看到數據層?如果您的身份驗證服務存在於可以看到數據庫的地方會怎樣 - 從IoC的角度來看,您的客戶並不在乎它的來源。如果基礎架構層無法看到數據庫,並且您的授權是基於數據庫的,那麼它不能存在於基礎架構層中,因爲您已經想出了:) – n8wrl

+0

正是!最初,我打算在服務層做這件事。然而,我質疑這是因爲「這不是案例研究中的做法」。所以我問了一下,但是由於問題分離(從我發佈的報價中),建議將其保留在基礎架構層中。我正在考慮將它放入服務層,以便我可以使用我的存儲庫來與數據庫進行通信。你會基於此建議什麼? – getoutofmylaboratory