Когда SimpleMembershipProvider не является поставщиком по умолчанию

Если у вас настроено несколько поставщиков членства, например:

    <membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" />
    <add name="UsersMembershipProvider" type="umbraco.providers.UsersMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" passwordFormat="Hashed" />
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
  </providers>
</membership>

Затем, скажем, для определенного раздела на сайте я хочу использовать SimpleMembershipProvider для аутентификации (остальная часть сайта будет использовать поставщика по умолчанию, то есть UmbracoMembershipProvider) ... Поэтому мне нужно инициализировать SimpleMembership с помощью:

            WebSecurity.InitializeDatabaseConnection(
            Constants.Membership.ConnectionStringName,
            Constants.Membership.TableName, 
            Constants.Membership.UserIdColumnName, 
            Constants.Membership.UserNameColumnName, 
            false);

Но похоже, что приведенный выше код работает только тогда, когда SimpleMembershipProvider является поставщиком по умолчанию. Я не вижу способа указать имя поставщика, которого я хочу использовать? Это вообще возможно? Или просто членство предполагает, что у вас определен один поставщик членства и роли?


person stevev    schedule 14.08.2013    source источник


Ответы (1)


SimpleMembershipProvider - это реализация ExtendedMembershipProvider. Хотя WebSecurity будет работать с любой реализацией расширенного провайдера, он имеет некоторую сомнительную связь с SimpleMembershipProvider, если он используется.

Обычно SimpleMembershipProvider требует инициализации через WebSecurity, в противном случае при использовании расширенного интерфейса членства будет выдано исключение. Если он не инициализирован, он включает в себя поставщика ASPNET по умолчанию и может использоваться с исходным MembershipProvider интерфейсом и старой схемой.

Процедура инициализации только инициализирует поставщиков по умолчанию, при условии, что они могут быть преобразованы в простые реализации поставщиков. Так что да, вы не можете использовать SimpleMembershipProvider или SimpleRoleProvider, если они не настроены как экземпляры по умолчанию.

Дополнительную информацию об ограничениях SimpleMembershipProvider можно найти здесь.

Есть обходной путь. Вы можете использовать отражение, чтобы временно переключить поставщика на значение по умолчанию во время инициализации, а затем переключить его обратно. См. Пример того, как это сделать, в BetterMembership.Net. Эта библиотека расширяется SimpleMembershipProvider специально для использования в системах с несколькими поставщиками.

membershipProviderField = typeof(Membership)
         .GetField("s_Provider", BindingFlags.NonPublic | BindingFlags.Static);

var originalMembershipProvider = membershipProviderField.GetValue(null);
membershipProviderField.SetValue(null, mySimpleMembershipProvider);

WebSecurity.InitializeDatabaseConnection(...)

membershipProviderField.SetValue(null, originalMembershipProvider);
person TheCodeKing    schedule 18.10.2013