Поставщик членства в Active Directory ASP.NET и поставщик профиля SQL
-
23-08-2019 - |
Вопрос
В настоящее время я разрабатываю схему членства/профиля для нового проекта, над которым работаю, и надеялся получить информацию от других.
Проект представляет собой веб-приложение 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);
}