Sitecore根据外部成员资格数据库验证用户身份

时间:2011-08-04 16:36:08

标签: asp.net asp.net-membership sitecore

我有一个Sitecore网站,我希望将网站访客帐户存储在外部asp.net会员数据库中,但保持Sitecore内容编辑/管理员通过Sitecore界面进行管理(因此存储在'Core'数据库中)。 / p>

我已阅读以下论坛帖子 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>部分也设置为使用切换器提供者再次与指向所述会员DB的相应提供者。

到目前为止,我只是成功打破了Sitecore桌面中的用户管理器(如果Sitecore创建了外联网\匿名帐户,它会抛出异常Item has already been added. Key in dictionary: 'extranet\Anonymous' Key being added: '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>

1 个答案:

答案 0 :(得分:20)

在自定义成员资格/角色提供程序的情况下,您应该遵循的想法与AD moduleits setup instructions列出的内容类似。整个过程可分为几个步骤:

  • 将连接字符串添加到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"/>

@ensureAnonymousUser属性设置为false表示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" />

此后,您的数据库中的用户将在UserManager中显示为'myDomain\user',角色也是如此。 @storeFullNames='false'表示您的数据库存储的用户/角色没有域前缀,只有本地名称。如果自定义源是SQL(显然是),则通配符应该是默认值。

就是这样,现在应该可以了! :-)上述步骤的详细信息在this article中描述。