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

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

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

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

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

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

Любые комментарии будут с благодарностью.

Благодарю.

4 ответа

Решение

Прежде всего - я никогда не делал это сам.

Скотт Митчелл (Scott Mitchell) из серии " 4 парня из Ролла" предлагает отличную серию (14!! частей) на тему членства, ролей и систем провайдеров ASP.NET 2.0.

Насколько я понимаю, вы должны быть в состоянии настроить это поведение, которое вы ищете, используя в основном эти два раздела в вашем файле 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>

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

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

<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; 

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

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);
    }

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

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

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

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

Другие вопросы по тегам