【问题标题】:Sitecore authenticate users against external membership databaseSitecore 针对外部成员数据库对用户进行身份验证
【发布时间】:2011-10-20 04:27:42
【问题描述】:

我有一个 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 桌面中的用户管理器(如果 Sitecore 创建了 extranet\Anonymous 帐户,则会引发异常 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>

【问题讨论】:

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


    【解决方案1】:

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

    • 向 connectionstrings.config 添加连接字符串
    • 将成员资格/角色提供程序定义添加到 web.config 的 system.web 部分
    • 激活切换器
    • 为自定义提供商的用户/角色创建新域
    • 添加域/提供商映射

    添加连接字符串

    这很简单,而且您似乎已经这样做了。关键是要有一个到数据库的连接字符串,然后您可以从自定义提供程序中引用。

    添加成员资格/角色提供者定义

    另一个简单的步骤 - 只需在 web.config 的 system.web/membership/providers 部分下添加成员资格提供程序定义(在您的情况下为 myProvider),并在 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中有描述。

    【讨论】:

    • 非常感谢!这正是我所需要的。
    • 嗨,严,我收到了错误 'A domain specified in the Sitecore.Security.SwitchingMembershipProvider provider/domain map could not be found. Domain name: myDomain'。我在configuration/sitecore/domainManager/domains 下创建了域,这是添加域的正确位置吗?
    • 尝试将其添加到 /App_Config/Security/domains.config 文件中
    • 我自己刚刚在阅读这个。 sitecore 文档声明更改defaultProvider 属性。见第 15 页sdn.sitecore.net/upload/sitecore6/sc61keywords/…。现在我很困惑,该怎么办!
    • 看起来像是文档问题或内容过时...我会将此信息传递给 Sitecore 的负责人。同时,将realProviderName 更改为“切换器”,并保持defaultProvider 不变。如果您想知道,您可以使用 Reflector 浏览“sitecore”提供程序背后的类,并确保它在此切换机制上完成额外的服务工作
    猜你喜欢
    • 2011-06-10
    • 2016-07-29
    • 2020-07-10
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多