我正在關注專業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;
}
}
如果我不使用成員資格提供,我如何連接到數據庫來檢查用戶名和密碼匹配,其他可能的檢查項目之中?
認證是應用程序級別的問題。它不是你的域名的一部分。 – jfar