С членством ASP.Net, можно ли использовать несколько поставщиков членства для входа на один и тот же веб-сайт? - PullRequest
3 голосов
/ 12 августа 2010

Ситуация такая:

У нас есть несколько (19) сайтов, которые в настоящее время настроены на совместное использование одной базы данных членства ASP с использованием различных имен приложений, таких как:

<membership defaultProvider="Site1Membership">
  <providers>
    <add
      applicationName="/site1"
      name="Site1Membership" />
    <add
      applicationName="/site2"
      name="Site2Membership" />
  </providers>
</membership>

У меня вопрос: если в web.config определены несколько провайдеров, может ли пользователь войти в систему через другого провайдера по умолчанию?

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

Мы попытались предварительно связать имя пользователя с именем поставщика и applicationName при входе в систему, например:

site2: имя пользователя или site2Membership: имя пользователя

Ни один из них не работает.

Конечная цель заключается в том, что хотя мы хотим, чтобы 19 сайтов имели отдельных пользователей и обеспечивали безопасность (т. Е. Пользователи сайта 1 не могут войти на сайт 2), нам нужен 20-й сайт, где пользователи со всех сайтов могут входить в систему и совместно работать без необходимости второе имя пользователя / пароль.

1 Ответ

4 голосов
/ 12 августа 2010

Это можно сделать, однако вы должны написать собственный код.Короче говоря, вам нужен способ определить, к какой группе пользователей относится данный логин: конкретный пользователь приложения или «глобальный» пользователь.Я справился с этим, требуя, чтобы глобальные пользователи добавляли к своему имени входа что-то вроде «G \» или «MyCompany», тогда как обычные пользователи не обязаны это делать.

Аутентификация на самом деле довольно проста.В событии Click вашей кнопки входа или в методе OnAuthenticate объекта LoginControl вам просто нужно обнаружить пользователя и сопоставить его с правильным именем поставщика членства.

MembershipProvider provider;
if ( username.Text.StartsWith("G\") then
    provider = Membership.Providers["GlobalProvider"];
else
    provider = Membership.Providers["StandardProvider"];

if ( provider.ValidateUser( ... 

Роль становится сложной.SqlRoleProvider не предназначен для обработки нескольких приложений, использующих одно и то же хранилище пользователей.Вы должны изменить процедуры, используемые SqlRoleProvider, чтобы он соблюдал приложение MembershipProvider вместо того, чтобы использовать его по умолчанию, то есть использовать только приложение RoleProvider.Кроме того, вам необходимо убедиться, что глобальные пользователи автоматически добавляются к какой-либо роли при входе в систему.

...