Переключитесь на поставщика членства SQL из среды выполнения поставщика членства AD - PullRequest
4 голосов
/ 27 августа 2011

В моей функциональности администратора приложения asp.net я пытаюсь объединить аутентификацию AD и авторизацию форм для создания пользователей, ролей и назначения пользователей ролям и т. Д. Я настроил MembershipADProvider и AspNetSqlMembershipProvider в моем web.config с MembershipADProvider в качествепо умолчанию один.После входа пользователя с использованием аутентификации AD мне нужно переключить / назначить свой объект членства для использования AspNetSqlMembershipProvider, чтобы получить всех пользователей из объекта членства (из таблицы dbo.aspnet_Users).Как мне переключить провайдера во время выполнения?Я пробовал разные подходы после поиска этой проблемы, и пока что ни один из них мне не подходит.Вот несколько подходов, которые я попробовал: 1. foreach (MembershipProvider mp в Membership.Providers) {if (mp.Name == "MembershipADProvider") {Membership.Providers.Remove (MembershipADProvider ");
MembershipUserCollection users = Membership.GetAllUsers (); ddlUsers.DataSource = users; ddlUsers.DataBind ();
break;}}

Membership.Providers.Remove (MembershipADProvider ");- не работает, так как не поддерживается. Кроме того, попытался очистить Membership.Providers, а затем добавить только тип AspNetSqlMembershipProvider, который также не поддерживается.

  1. Я не могуустановите Membership.Provider со значением Membership.Providers ["AspNetSqlMembershipProvider"] в качестве Membership.Provider - свойство только для чтения.

  2. Я пытался выбрать строку подключения между двумя поставщиками, что неЭто провайдер, так как оба являются разными типами провайдеров ... если бы оба были провайдерами sqlserver, это бы сработало, я верю.

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

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Вы бы передавали явный провайдер в свой код, вместо того, чтобы напрямую брать зависимость от Memebership (которая просто включает в себя тот, который помечен в конфигурации по умолчанию). Нет необходимости менять их во время выполнения, подумайте, как это повлияет на безопасность потока.

Так что вместо того, чтобы говорить Membership.GetAllUsers();, вы бы сделали что-то вроде (у меня нет компилятора под рукой):

public UserSerivce : IUserService
{
   private MembershipProvider provider;

   public UserService(MembershipProvider provider)
   {
       this.provider = provider;
   }

   public IEnumerable<MembershipUser> GetUsers()
   {
       return provider.GetAllUsers();
   }

   public void DoSomethingElseUseful()
   {
       ...
   }

}

А затем использовать его для определенного поставщика:

var service = new UserService(Membership.Providers["mySqlMembershipProvider"]);
var users = service.GetUsers();

Или, если используется специальный код AD:

var service = new UserService(Membership.Providers["myADMembershipProvider"]);
var users = service.GetUsers();

Использование DI таким способом также помогает тестировать код.

0 голосов
/ 27 августа 2011

Если вам нужен список пользователей в таблице aspnet_Users, просто подключитесь к базе данных с System.Data.SqlClient объектами и запросите таблицу. Нет никакой причины (которую вы упомянули), чтобы использовать эти данные для получения этих данных.

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

Редактировать: я нашел несколько потенциально полезных сообщений об использовании нескольких поставщиков членства. Похоже, что общая идея состоит в том, чтобы реализовать пользовательский код, обрабатывающий событие Login.Authenticate в вашем элементе управления Login, и использовать Membership.Providers["ProviderName"].ValidateUser для попытки аутентификации с каждым провайдером.

http://www.stevideter.com/2008/03/20/using-two-membership-providers-for-aspnet-logins/ http://forums.asp.net/p/1112089/1714276.aspx

...