DDD служба аутентификации - PullRequest
5 голосов
/ 11 июля 2011

Я слежу за ситуационным исследованием в профессиональных шаблонах проектирования 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;
    }       
}

Если я не использую поставщика членства, как мне подключиться к базе данных, чтобы проверить, совпадают ли имя пользователя и пароль, среди других возможных проверок?

1 Ответ

3 голосов
/ 11 июля 2011

На вашем уровне инфраструктуры создайте класс, который реализует ILocalAuthenticationService и выполняет необходимые вызовы.

Или, если ILocalAuthenticationService слишком ASP.NET-y (с его типами возврата User), вам, возможно, придется свернуть свой собственный вариант ILocalAuthenticationService и реализовать его.

Затем используйте контейнер IoC для разрешения службы ILocalAuthenticationService, когда вам это нужно.

...