Asp.net

Sitecore 針對外部成員數據庫對使用者進行身份驗證

  • August 5, 2011

我有一個 Sitecore 站點,我希望將網站訪問者帳戶儲存在外部 asp.net 會員數據庫中,但通過 Sitecore 界面管理 Sitecore 內容編輯器/管理員(因此儲存在“核心”數據庫中)。

我已閱讀以下論壇文章 http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?postid=35305

其中提到了以下文件 http://sdn.sitecore.net/upload/sitecore6/62/membership_providers_sc62-a4.pdf http://sdn.sitecore.net/upload/sitecore6/62/security_api_cookbook_sc60-62-a4。 PDF http://sdn.sitecore.net/upload/sdn5/modules/ad/low-level_sitecore_cms_security_and_custom_providers-a4.pdf

但這些似乎都沒有提供我需要做什麼的完整畫面。

我目前已將該<membership>部分設置為使用“切換器”提供程序(相應的提供程序指向我的會員數據庫),並且該<roleManager>部分還設置為再次使用切換器提供程序,相應的提供程序指向所述會員數據庫。

到目前為止,我只成功地破壞了 Sitecore 桌面中的使用者管理器(Item has already been added. Key in dictionary: 'extranet\Anonymous' Key being added: 'extranet\Anonymous'如果 Sitecore 創建了 extranet\Anonymous 帳戶,或者Object reference not set to an instance of an object.我刪除了該使用者帳戶,則會引發異常。

作為背景資訊,我使用的是 Sitecore 6.5,我的網路配置的相關部分如下

<membership defaultProvider="switcher">
 <providers>
   <clear/>
   <add name="sitecore"
        type="Sitecore.Security.SitecoreMembershipProvider, Sitecore.Kernel"
        realProviderName="myProvider"
        providerWildcard="%"
        raiseEvents="true"/>
   <add name="sql"
        type="System.Web.Security.SqlMembershipProvider"
        connectionStringName="core"
        applicationName="sitecore"
        minRequiredPasswordLength="1"
        minRequiredNonalphanumericCharacters="0"
        requiresQuestionAndAnswer="false"
        requiresUniqueEmail="false"
        maxInvalidPasswordAttempts="256"/>
   <add name="switcher"
        type="Sitecore.Security.SwitchingMembershipProvider, Sitecore.Kernel"
        applicationName="sitecore"
        mappings="switchingProviders/membership"/>
   <add name="myProvider"
        type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        applicationName="sitecore"
        connectionStringName="myDatabase"
        minRequiredPasswordLength="1"
        minRequiredNonalphanumericCharacters="0"
        requiresQuestionAndAnswer="false"
        requiresUniqueEmail="false"
        maxInvalidPasswordAttempts="10" />
 </providers>
</membership>
<roleManager defaultProvider="switcher" enabled="true">
 <providers>
   <clear/>
   <add name="sitecore" 
        type="Sitecore.Security.SitecoreRoleProvider, Sitecore.Kernel"
        realProviderName="myProvider"
        raiseEvents="true"/>
   <add name="sql"
        type="System.Web.Security.SqlRoleProvider"
        connectionStringName="core"
        applicationName="sitecore"/>
   <add name="switcher"
        type="Sitecore.Security.SwitchingRoleProvider, Sitecore.Kernel"
        applicationName="sitecore"
        mappings="switchingProviders/roleManager"/>
   <add name="myProvider"
        type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        applicationName="sitecore"
        connectionStringName="myDatabase" />
 </providers>
</roleManager>

在自定義成員資格/角色提供者的情況下,您應該遵循的想法類似於AD 模組在其設置說明中列出的內容。整個過程可以分為幾個步驟:

  • 將連接字元串添加到 connectionstrings.config
  • 將成員資格/角色提供者定義添加到 web.config 的 system.web 部分
  • 啟動切換器
  • 從自定義提供程序為使用者/角色創建一個新域
  • 添加域/提供商映射

添加連接字元串

這很簡單,似乎這就是您已經完成的。關鍵是要有一個到數據庫的連接字元串,然後您可以從自定義提供程序中引用。

添加成員資格/角色提供者定義

另一個簡單的步驟 - 只需在 web.config 的部分下添加成員資格提供者定義(myProvider在您的情況下) ,然後在部分下添加角色提供者定義。順序並不重要。此時,您無需修改上述部分中的任何其他提供程序定義。system.web/membership/providers``system.web/roleManager/providers

啟動切換器

這就是它變得複雜的地方。首先,不要更改@defaultProvider屬性值。預設情況下,它'sitecore'應該保持原樣。相反,找到名為 的提供程序"sitecore",並將其@realProviderName屬性值從更改'sql''switcher'

名為“switcher”的提供者負責切換提供者和組合 GetAll/Find 方法的結果背後的所有魔法。

創建一個新域

您應該為您將通過自定義提供程序從自定義數據庫中獲取的使用者/角色創建一個新域。像這樣的東西:

  <domain name="myDomain" ensureAnonymousUser="false"/>

設置為 false的@ensureAnonymousUser屬性意味著 Sitecore 不會將匿名使用者添加到您的域,因此不會有myDomain\Anonymous. 這通常是自定義域所需的行為。

添加域/提供商映射

這是讓 Sitecore 知道每個提供商為哪個域提供服務的最後一步。一個提供程序可以處理多個域(預設的 Sitecore SQL 提供程序儲存來自“sitecore”和“extranet”域的使用者),但反之則不行。

因此,打開主 web.config 文件並瀏覽到該configuration/sitecore/switchingProviders部分。為會員小節添加類似的內容:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />

以及 roleManager 小節的類似內容:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />

在此之後,您數據庫中的使用者將像'myDomain\user'在 UserManager 中一樣可見,角色也是如此。這@storeFullNames='false'意味著您的數據庫儲存沒有域前綴的使用者/角色,只是本地名稱。如果您的自定義源是 SQL(顯然是),萬用字元應該是預設值。

就是這樣,現在它應該可以工作了!:-) 上述步驟的詳細資訊在本文中進行了描述。

引用自:https://stackoverflow.com/questions/6945187