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

StackOverflow https://stackoverflow.com/questions/895002

Вопрос

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

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

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

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

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

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

Спасибо.

Это было полезно?

Решение

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

Там действительно отличный сериал (14!!части) по всей теме членства, ролей и систем поставщиков профилей ASP.NET 2.0 Скотта Митчелла на странице 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>

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

Другие советы

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

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

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

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

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

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

Я использую 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);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top