Поставщик членства в 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