Какие схемы аутентификации и авторизации вы используете - и почему?

мы начинаем разрабатывать целую кучу новых сервисов для создания (WCF, ADO.NET службы данных, возможно, в облаке в какой - то момент), и один вопрос, который всплывает, - какая схема аутентификации и авторизации использовать-их довольно много!

нам в основном нужно иметь возможность идентифицировать пользователей (реальных людей и "виртуальных" пользователей приложений/служб) по широкому спектру протоколов-HTTP, HTTPS, TCP - и нам нужно назначить им хотя бы кучу ролей / разрешений см. определенные данные и / или выполните определенные операции.

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

таким образом, есть в основном три варианта, я думаю:

  1. используя ASP.NET система членства-создание пользователей и назначение ролей там
  2. используйте AzMan (менеджер авторизации), который, кажется, будьте более гранулированной, более зрелой, более сложной системой (с пользователями, задачами, группами - три уровня, а не только пользователь + роли)
  3. ролл наши собственные

прежде всего-какой из этих трех вы бы порекомендовали? Любой почему?

во-вторых - есть ли еще варианты, которые мне не хватает?

Спасибо за любые подсказки, указатели, мнения!

Марк

PS: видя ответы до сих пор, я поражен количеством людей, голосующих за вариант #3. Я бы подумал, что MS сможет разработать что-то многоразовое, которое могло бы справиться со всеми этими требованиями....

8 ответов


на самом деле, это комбинация 1 и 3.

вы можете воспользоваться множеством инструментов и функций, которые предоставляет вам фреймворк, написав членство, роль или профиль провайдера, если параметры по умолчанию не совсем так, как вы хотели бы.

мы сделали это на нескольких клиентских сайтах - например, один из наших клиентов имеет большинство своих пользователей, хранящихся как пользователи Commerce Server, и используйте систему профилей Commerce Server, поэтому мы написали поставщику членства и профиля, чтобы поговорить с этими хранилищами данных - довольно простой пример.


большинство людей, вероятно, собираются для 3 из - за необходимости аутентификации по необработанному TCP-это вводит слой за пределами стандартного ASP.NET поставщики членства.

большая часть того, что производит MS, - "ОК" или "достаточно хорошо", но всегда будут крайние случаи, когда вы хотите что-то сделать " не вполне стандартный" это означает, что вы в конечном итоге сворачиваете свой собственный. Я думаю, чтобы иметь что-то за пределами "Basic Auth" или "Windows Auth", что было просто для вашего среднего разработчика, они взяли разумный вариант "давайте просто построим это для интернета".

Если вы посмотрите на многочисленные способы аутентификации против службы WCF, вы увидите, что я имею в виду - эти are конструировал отрегулировать различные механизмы перехода, и поэтому очень больше сложный.

тем не менее, роли по умолчанию и поставщики профилей довольно ограничены (роли: нет иерархии, поэтому вам нужно проверить каждую возможную роль или явно назначить каждую роль пользователю; профили: все хранятся в одном поле как запятые отдельные значения - нелегко найти всех пользователей, у которых есть набор значений).


используем (3). На самом деле это помогло нам в сценарии интеграции синхронизировать учетные записи с

  1. бизнес-процессы
  2. другие системы (не все в одном стеке технологий (ASP.NET))

на недавнем проекте мы расширили ASP.NET поставщик членства (написал пользовательский поставщик) с целью использования некоторых элементов управления на основе ролей для управления разрешениями. Теперь, когда проект созрел достаточно, мы обнаруживаем, что элементы управления недостаточно гибки для наших требований, и в какой-то степени мы сожалеем о том, что идем по пути членства MS. Прокатка собственной аутентификации, если у вас есть время, чтобы архитектор это правильно будет лучшим выбор.

похоже, ваше приложение немного гибридно в том, что вы обслуживаете внутренних и внешних клиентов, но, возможно, также уделяете некоторое внимание интеграции OpenID для внешних клиентов. Есть некоторые большие ASP.NET элементы управления OpenID, которые действительно делают обработку новых учетных записей для внешних клиентов без проблем. Это, конечно, зависит от того, насколько "публичным" является ваше приложение.


в LDAP кого? Это бесплатно, кросс-plaftorm, прост в использовании и администрировании удаленно, имеет мосты к другим схемам auth и привязки на других языках, которые вы знали, существовали...


разве Азман не из 2003?

Я бы рекомендовал 1 или 3. Лично я всегда ходил на 3. Есть много функций, которые у меня есть, которые я не использую или не хочу использовать.


Я бы держался подальше от Азмана. Однажды мы поехали по этой дороге, и нам не понравилась та часть города, где мы сломались. Мы всегда делали логины на основе AD, которые используют SID текущего пользователя для связи с пользователем в базе данных, а затем брали разрешения оттуда. Учитывая вашу настройку, это может быть невозможно (или практично), но я бы держался подальше от AzMan в любом случае.


Я не разработчик ASP или .NET, но моя кишка говорит (3). Вы действительно не хотите, чтобы общедоступное веб-приложение имело какой-либо доступ к вашей корпоративной сети, а тем более не могло размещать учетные данные auth где-либо рядом с AD.


Вы, кажется, слишком много и слишком расширяемым, чтобы придерживаться одного технологического решения

решение 3.

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

что-то типа:

    [ClassAttribute ( "Yordan Georgiev", "1.0.2", "20090302", "20090415" , false )]
public class User
{
    #region DomainName
    private string _DomainName;
    public string DomainName
    {
        get { return _DomainName; }
        set { _DomainName = value; }
    } //eof property DomainName 


    #endregion DomainName

    #region Status
    private int _Status;
    public int Status
    {
        get { return _Status; }
        set { _Status = value; }
    } //eof property Status 


    #endregion Status

#region Password
    private string _Password = Resources.GV.Pass; 
    public string Password
    {
        get { return _Password; }
        set {
            _Password = GenApp.Utils.Security.Encryptor.Encrypt ( value,
                GenApp.Conf.GenAppSettings.Instance.EncryptionAlgorithm );
            //debug_Password = value; //unencrypted 
        }
    } //eof property Password 


    #endregion Password 

#region ListUserRoles
        private List<UserRole> _ListUserRoles;
        public List<UserRole> ListUserRoles { get { return _ListUserRoles; } set     { _ListUserRoles = value; } }
        #endregion ListUserRoles


    #region UserSettings
    private GenApp.Conf.UserSettings _UserSettings;
    public GenApp.Conf.UserSettings UserSettings
    {
        get {
            if (_UserSettings == null)
                _UserSettings = (GenApp.Conf.UserSettings)GenApp.Conf.GenAppSettings.Instance;

            return _UserSettings; 
        }
        set { _UserSettings = value; }
    } //eof property UserSettings 

}