1

当您配置了多个成员资格提供程序时,例如:

    <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 是 defaultProvider 时才有效。我看不到指定要使用的提供程序名称的方法?这甚至可能吗?或者,simplymembership 是否假设您定义了一个成员资格和角色提供者?

4

1 回答 1

0

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);
于 2013-10-18T07:58:35.213 回答