1

되지 않습니다 : 다음여러 멤버 자격 공급자가 같이 구성되어있을 때 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을 사용하고자하는 사이트의 특정 부분에 대한 가정 해 봅시다

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

그러나 SimpleMembershipProvider은 defaultProvider 때 위의 코드에만 작동 보인다 사이트 그러므로 내가 함께 SimpleMembership를 초기화해야 ... 기본 제공 즉 UmbracoMembershipProvider)를 사용합니다. 사용할 공급자 이름을 지정하는 방법을 볼 수 없습니까? 이것은 가능한가? 또는 멤버쉽과 역할 제공자가 하나만 정의되었다고 가정합니다.

답변

0

SimpleMembershipProviderExtendedMembershipProvider입니다. WebSecurity은 확장 된 공급자의 모든 구현과 함께 작동하지만 SimpleMembershipProvider (사용 된 경우)과의 몇 가지 의심스러운 연결이 있습니다.

기본적으로 SimpleMembershipProviderWebSecurity을 통해 초기화해야합니다. 그렇지 않으면 확장 멤버십 인터페이스를 사용할 때 예외가 발생합니다. 초기화되지 않은 경우 기본 ASPNET 공급자를 래핑하고 원래 MembershipProvider 인터페이스 및 이전 스키마와 함께 사용할 수 있습니다.

초기화 프로 시저는 간단한 공급자 구현으로 캐스팅 될 수있는 경우에만 기본 공급자를 초기화합니다. 따라서 예 (SimpleMembershipProvider 또는 SimpleRoleProvider)는 기본 인스턴스로 구성하지 않는 한 사용할 수 없습니다.

SimpleMembershipProviderhere의 제한 사항에 대한 추가 정보가 있습니다.

해결 방법이 있습니다. 리플렉션을 사용하면 초기화하는 동안 공급자를 임시로 일시적으로 교체 한 다음 다시 전환 할 수 있습니다. 정확히 수행하는 예는 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);