Поставщик членства в Active Directory ASP.NET и поставщик профиля SQL

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

Проект представляет собой веб-приложение ASP.NET, и в связи с короткими временными рамками я пытаюсь использовать все компоненты, встроенные в платформу .NET, которые я могу. Вероятно, сайт будет развлекать ‹5000 пользователей. У каждого пользователя будет профиль, в котором пользовательские настройки и объекты будут сохраняться между посещениями.

Я должен использовать существующую Active Directory для аутентификации. Поскольку схему AD нельзя расширить для хранения новых полей, я должен хранить пользовательские настройки и объекты в другом хранилище данных. Мне также сказали, что ADAM, вероятно, не является возможным решением.

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

Мне было интересно, возможно ли это вообще, и если да, то кому-нибудь повезло с таким подходом.

Будем признательны за любые комментарии.

Спасибо.


person cmcginty    schedule 21.05.2009    source источник


Ответы (4)


Во-первых, я никогда не делал этого сам.

На 4 парня из Роллы.

Насколько я понимаю, вы должны иметь возможность настроить это поведение, которое вы ищете, используя в основном эти два раздела в своем web.config:

  <!-- configure Active Directory membership provider -->
  <membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
    <providers>
      <add name="AspNetActiveDirectoryMembershipProvider"
           type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=2.0.3600, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" />
    </providers>
  </membership>

  <!-- configure SQL-based profile provider -->      
  <profile defaultProvider="SqlProvider">
    <providers>
      <add name="SqlProvider"
        type="System.Web.Profile.SqlProfileProvider"
        connectionStringName="SqlProfileProviderConnection"
        applicationName="YourApplication" />
    </providers>

    <!-- specify any additional properties to store in the profile -->   
    <properties>
      <add name="ZipCode" />
      <add name="CityAndState" />
    </properties>
  </profile>

Я думаю, это должно сработать :-)

person marc_s    schedule 21.05.2009
comment
Спасибо, Марк. Я сделал это сегодня утром, и все прошло хорошо. Спасибо за вашу помощь! - person cmcginty; 22.05.2009
comment
если мы используем AD для членства и аутентификации и aspnet_profile для хранения профиля. Как создаются и регулируются отношения, т.е. Идентификатор пользователя. Другими словами, как asp.net знает, на основе какого атрибута AD генерировать UserId? - person Nil Pun; 01.08.2011
comment
Не могли бы вы ответить stackoverflow.com/questions/9588265/ ? - person LCJ; 06.03.2012

В дополнение к этому, как ответил Марк:

<add name="AspNetActiveDirectoryMembershipProvider"
           type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=2.0.3600, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" />

вам также может потребоваться добавить

connectionStringName="ADService",
attributeMapUsername="sAMAccountName"

с соответствующей строкой подключения

<connectionStrings>
    <add name="ADService" connectionString="LDAP://ServerIP" />
</connectionStrings>

Если вы используете .net 4.0, вам нужно будет заменить

Version=2.0.3600 

с участием

Version=4.0.0.0

Итак, наконец,

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
      <providers>
        <add name="AspNetActiveDirectoryMembershipProvider"
             connectionStringName="ADService"
             type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=4.0.0.0, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a"
             attributeMapUsername="sAMAccountName"/>
      </providers>
    </membership>

и поскольку он установлен по умолчанию, на него можно ссылаться как:

MembershipProvider provider = Membership.Provider; 
person Birey    schedule 25.03.2011

Спасибо за информацию, это очень помогло. Также вместо установки поставщика по умолчанию с MembershipProvider provider = Membership.Provider; вы можете установить его с помощью тега членства.

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

Я также написал небольшое руководство и загрузку для проекта и источника Visual Studio, настроенного для использования AspNetActiveDirectoryMembershipProvider.

Аутентификация на основе форм ASP.NET - с использованием AspNetActiveDirectoryMembershipProvider

person Chris Towles    schedule 25.04.2011

Я использую Visual Studio 2012 и пытаюсь сделать так, как было предложено, но отображается ошибка:

To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider".

Итак, я обнаружил, что необходимо внести несколько изменений в форму входа по умолчанию на VS2012 с MVC 4 и структурой сущностей следующим образом:

в файле "AccountController.cs"

на «общедоступном входе в систему ActionResult (модель LoginModel, строка returnUrl)»

Изменить

    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))

за

    if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password))

на «общедоступном ActionResult LogOff ()»

Изменить

    WebSecurity.Logout();

за

    FormsAuthentication.SignOut();

и добавьте следующее: FormsAuthentication.SetAuthCookie (model.UserName, false);

    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password))
        {

            FormsAuthentication.SetAuthCookie(model.UserName, false);               

            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }
person Rafael Pimenta    schedule 17.06.2013
comment
+1 спасибо! Это было именно то, что решило проблему для меня. Больше нигде я не встречал эту информацию при поиске проблем с AspNetActiveDirectoryMembershipProvider. - person Jon Peterson; 02.10.2013