Я слежу за ситуационным исследованием в профессиональных шаблонах проектирования ASP.NET Скотта Миллета.В этом примере аутентификация обрабатывается в проекте инфраструктуры.Он содержит реализации, такие как AspFormsAuthentication: IFormsAuthentication, AspMembershipAuthentication: ILocalAuthenticationService.
Это работает нормально, поскольку он использует встроенный поставщик членства, однако я НЕ, поэтому мне потребуется доступ к моим репозиториям.В моем сценарии, не лучше ли разместить мою реализацию ILocalAuthenticationService и AspMembershipAuthentication в проекте Services?
Я спрашивал об этом в другом месте, и кто-то ответил:
Я все равно разместил быфункциональность для извлечения учетных данных на уровне инфраструктуры, так как этот уровень выравнивается по вертикали относительно других горизонтальных слоев, и все слои имеют к нему доступ.Поскольку вы не используете поставщика членства ASP.NET и, возможно, используете что-то нестандартное, в котором могут использоваться только зашифрованные учетные данные, вы все равно можете использовать слой инфраструктуры, чтобы обернуть доступ к этим учетным данным и разрешить хранилищу использовать их при необходимости.Вы могли бы иметь слой Services, чтобы получить их и передать их, но тогда у вас будет слишком много уровней, понимающих, как данные будут извлечены / сохранены и какой доступ к авторизации требуется, что не хорошо при попытке наслоить и разделить проблемы.
Отлично.Это имеет смысл.Но я не знаю, куда идти отсюда.Код из тематического исследования:
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;
}
}
Если я не использую поставщика членства, как мне подключиться к базе данных, чтобы проверить, совпадают ли имя пользователя и пароль, среди других возможных проверок?