ASP.NET Active Directory Членство Поставщик и SQL Профиль Поставщик - PullRequest
16 голосов
/ 22 мая 2009

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

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

15 голосов
/ 22 мая 2009

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

Скотт Митчелл (Scott Mitchell) из серии «1003 * 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>

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

3 голосов
/ 25 марта 2011

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

<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; 
2 голосов
/ 17 июня 2013

Я использую 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))

в "public 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);
    }
2 голосов
/ 25 апреля 2011

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

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

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

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

...