当SimpleMembershipProvider不是默认提供者时

时间:2013-08-14 00:16:04

标签: membership-provider simplemembership custom-membershipprovider

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

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

1 个答案:

答案 0 :(得分:0)

SimpleMembershipProviderExtendedMembershipProvider的实现。虽然WebSecurity可以与扩展提供程序的任何实现一起使用,但如果使用SimpleMembershipProvider,它会与SimpleMembershipProvider有一些可疑的耦合。

基本上WebSecurity需要通过ASPNET初始化,否则在使用扩展成员资格接口时会抛出异常。如果没有初始化,那么它将包装默认的MembershipProvider提供程序,并且可以与原始SimpleMembershipProvider接口和旧架构一起使用。

初始化例程仅初始化默认提供程序,前提是它们可以转换为简单的提供程序实现。所以是的,你不能使用SimpleRoleProviderSimpleMembershipProvider,除非它们被配置为默认实例。

有关SimpleMembershipProvider here的限制的更多信息。

有一种解决方法。您可以使用反射在初始化期间临时将提供程序交换为默认值,然后将其切换回来。有关完成此操作的示例,请参阅BetterMembership.Net。该库扩展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); 专门用于多提供商系统。

{{1}}