0

我正在尝试访问我的解决方案中某个网站的页面编辑器,同时登录到同一 Sitecore 解决方案中另一个网站的 PE。我通过编写我要访问的站点的 URL 来做到这一点,然后是“/?sc_mode=edit”。我的问题是我被重定向到 Sitecore 登录页面。这两个网站具有不同的安全域。这只是在将我们的解决方案从 Sitecore 6.5 升级到 Sitecore 版本 7.1 后才开始发生这是 Sitecore 行为的变化,还是我忽略了允许此类行为的任何设置?我想访问其他站点的 PE,而无需再次验证自己。

更新

为清楚起见,我将添加有关我正在尝试修复的特定功能的更多详细信息:我们网站的 PE 上有一个自定义状态栏,允许用户从解决方案中选择另一个站点并导航到其 PE。实现这一点的代码在 /sitecore/admin 的布局文件中实现,称为AutoLogin.aspx
每次用户从下拉选择器中选择另一个选项时,他都会通过 JavaScript 重定向到他选择的域上的 AutoLogin 脚本。这是自动登录的代码:

<%@ Page Language="C#" AutoEventWireup="true" %>

<%@ Import Namespace="Sitecore" %>
<%@ Import Namespace="Sitecore.Data" %>
<%@ Import Namespace="Sitecore.Data.Items" %>
<%@ Import Namespace="Sitecore.Data.Fields" %>
<%@ Import Namespace="Sitecore.Globalization" %>
<%@ Import Namespace="Sitecore.Configuration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Auto Login</title>
<script runat="server" type="text/C#">

    protected void Page_Load(object sender, EventArgs e)
    {
        var user=HttpContext.Current.Server.UrlDecode(Request["user"]);
        Sitecore.Web.Authentication.DomainAccessGuard.Kick(Session.SessionID);
        if (Sitecore.Security.Authentication.AuthenticationManager.Login(user))
        {
            Response.Redirect("/sitecore/shell/applications/webedit.aspx");
        }
        else
        {
            Response.Write("Invalid username.");
        }   
    }

</script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Auto login in Page Editor
    </div> 
    </form>
</body>
</html>

AutoLogin 脚本将用户从会话中踢出并尝试将他登录到新域中。这在理论上似乎是合理的,但在实践中似乎行不通。出于某种原因,在踢出用户之后(以及在重新登录之前),Sitecore.Context.User.Name变量仍然设置为在调用 Kick 命令之前登录的用户名。

4

1 回答 1

1

Sitecore CMS 用户身份验证取决于客户端 cookie。浏览器将 cookie 与主机名相关联。如果 CMS 用户针对 cms.domain.tld 进行身份验证,除非您采取措施将身份验证 cookie 与域 (domain.tld) 而不是子域 (cms.domain.tld) 相关联,否则浏览器将不会在 HTTP 中发送 cookie请求 domain.tld 或其他子域,例如 en.domain.tld 和 mobile.domain.tld。

此外,当用户调用为预览或页面编辑器打开新浏览器窗口的命令时,Sitecore 使用当前主机名,这是用户进行身份验证的主机名 (cms.domain.tld)。这可能有利于身份验证 cookie,但您可能需要在 CMS 环境中配置托管站点以使用路径进行站点解析,而不是使用主机名。您可以在 httpRequestBegin 管道中实现一个处理器来覆盖默认的 SiteResolver,例如,根据请求的 URL 中的路径而不是主机名来确定上下文站点。这样的解决方案可以迭代托管站点以确定哪个具有与所请求项目的路径匹配的路径,这可能基于应用 Rendering.SiteResolving 设置的现有逻辑。这种努力并非特定于 cookie 和主机名,因此超出了本文的范围。如果有人要求提供这种方法的这样一个示例,即使没有人这样做,我也可能会尝试实现一些东西。

我知道 6.6 中的 cookie 也是域依赖的。在 Sitecore 6.5 上,我不知道具体情况如何。

你可以在这里找到更多:

于 2014-03-11T19:55:01.280 回答