Модель входа для ASP.NET - PullRequest
       6

Модель входа для ASP.NET

2 голосов
/ 06 января 2011

Можете ли вы помочь мне с моей проблемой:

У меня есть веб-сайт ASP.NET, который имеет некоторые основные функции авторизации (Вход / Выход из системы и т.д.).В настоящее время у меня есть 3 основных метода:

  • bool Login (имя строки, пароль строки);
  • bool IsLogged ();
  • string GetUserID ();

Все эти методы «жестко закодированы» в один класс.Методы входа проверяют базу данных, чтобы определить, что пользователь существует.Но затем я решил использовать XML-файл для хранения пользователей, это означает, что вся логика, проверяющая пользователя, должна быть переписана.

У меня есть идея использовать следующий «шаблон»:

  1. Создать интерфейс (например, ILoginProvider), который объявляет те 3 метода, которые описаны выше
  2. Реализацияэтот интерфейс в любом классе и написать специальную логику в методе Login () для проверки XML-файла или базы данных
  3. Передать этот класс ???(вот моя проблема)

Я подумал создать класс (например, LoginHelper), который может принимать интерфейс ILoginProvider в качестве аргумента:

class LoginHelper {

    private static ILoginProvider provider;

    // this method should be called somewhere in Application_Startup event in Global.asax
    public static void RegisterLoginProvider(ILoginProvider inst) {
        provider = inst; 
    }
}

, а затем написать необходимые методы:

public static bool IsLogged() {
    return provider.IsLogged();
}

, а затем вызовите метод RegisterLoginProvider () в Global.asax в событии Application_Startup:

MyCustomProvider prov = new MyCustomProvider(); // this class implements ILoginProvider interface
LoginHelper.RegisterSecurityProvider(prov);

Правильный ли способ реализации такой логики для замены одних «провайдеров» другими?

Ответы [ 2 ]

1 голос
/ 06 января 2011

Вы пытались абстрагироваться от функциональности входа в систему, что очень приятно. Далее вам нужно сделать этот помощник для привязки страницы через DependencyInjecttion, т.е. вы должны добавить constrcutro в класс с LoginInterface в качестве аргумента. Затем вы можете использовать такие утилиты, как StructureMap, чтобы получить экземпляры во время выполнения.

Благодаря наличию интерфейсов мы можем обеспечить адаптивность для будущих случаев, когда вы можете перейти на БД или веб-сервис.

1 голос
/ 06 января 2011

Способ, которым это часто делается, заключается в использовании локатора службы (Unity, StructureMap и т. Д.) Или пользовательской фабрики, где вы запрашиваете экземпляр ILoginProvider и возвращается правильный.

Ответственность за выбор типа создаваемого ILoginProvider лежит не на вызывающем классе.

//get a login provider from via a service locator
ILoginProvider provider = DependencyLookup.Resolve<ILoginProvider>();

Используя локаторы сервисов, вы регистрируетесь в ILoginProvider, какую реализацию использовать, либо в конфигурации XML, либо в коде. Вот пример для Unity.

public static class ContainerConfiguration
{
    public static void Configure()
    {
        ServiceLocator.Current.RegisterType<ILoginProvider, XmlLoginProvider>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...