2

我有一个 Sitecore 6.4 设置,编辑器可以单击按钮生成 Word 文档。我正在将文件添加到媒体库,并且工作正常。编辑器将单击内容编辑器中的按钮,生成文件,生成媒体项目,然后内容编辑器将在媒体库中显示新项目,编辑器可以单击功能区或项目上的“下载”按钮下载它。但是,我的媒体库被不必要地填满了,所以我试图绕过媒体库。

我没有像以前那样将文件放在任意位置,而是将它放在临时目录中,如下所示:

wordOutputPath = Sitecore.IO.FileUtil.GetWorkFilename(Sitecore.Configuration.Settings.TempFolderPath, printItem.Name, ".docx");
File.Copy(wordTemplatePath, wordOutputPath);
        
WordprocessingDocument doc = WordprocessingDocument.Open(wordOutputPath, true);

在我用内容“填充”文件后,我这样做:

Sitecore.Context.ClientPage.ClientResponse.Download(wordFilePath);

现在,如果我以 Sitecore 管理员身份登录,我会看到浏览器的下载对话框并可以下载文件。但是,如果我以非管理员用户身份登录,我会得到一点点点击和呼呼声,可以说,文件已生成,但浏览器中永远不会出现保存文件对话框。我可以通过文件系统进入并查看并打开 Word 文档,它看起来不错。

我在 6.6 的 Sitecore 发行说明中发现了一些内容:

发布 Sitecore CMS 和 DMS 6.6.0 rev。130111(6.6.0 更新 3)

[...]

各种各样的

Only Administrators were allowed to download files. (316774, 348557)

    This was a problem in several areas of the system, for example the Package Generator and the Export Language Wizard in the CMS. It also affected the Export Users Wizard in the ECM module.

所以我尝试使用 SecurityDisabler(不再有方便的代码)和 UserSwitcher,如下所示:

using (new Sitecore.Security.Accounts.UserSwitcher(Sitecore.Security.Accounts.User.FromName("sitecore\admin", false)))
                    {
                        Sitecore.Context.ClientPage.ClientResponse.Download(wordFilePath);
                    }

IUSR 和 IIS_IUSRS 帐户都对临时文件夹具有读取、列出和读取/执行权限,并且各个文件也显示这两个帐户的读取和读取/执行权限。

我可以做些什么来允许非管理员用户下载这些文件?6.6中修复的错误与它有什么关系吗?

谢谢你。

4

1 回答 1

0

调用 Sitecore.Context.ClientPage.ClientResponse.Download() 方法将导致在 Web 浏览器中将下载命令发送回 Sitecore 客户端,然后再调用服务器执行它。这就是为什么在调用 Sitecore.Context.ClientPage.ClientResponse.Download() 方法之前使用安全切换器(或安全禁用器)没有效果的原因,因为仅管理员限制将应用于其他地方的下载。

如果你在你的 webroot 中搜索 sitecore\shell 目录,你会发现有一个名为 download.aspx 的文件。这应该是下载请求发送到的实际页面。这个 web 表单页面继承了 Sitecore.Shell.DownloadPage 类,所以如果你看一下这个类的实现,你会发现 OnLoad 方法是这样实现的:

protected override void OnLoad(EventArgs e)
{
    Assert.ArgumentNotNull(e, "e");
    base.OnLoad(e);
    string fileHandle = StringUtil.GetString(new string[] { base.Request.QueryString["file"] });
    bool flag = false;
    string filename = FileHandle.GetFilename(fileHandle);
    if (!string.IsNullOrEmpty(filename))
    {
        fileHandle = filename;
        flag = true;
    }
    if (!string.IsNullOrEmpty(fileHandle))
    {
        if (MediaManager.IsMediaUrl(fileHandle))
        {
            this.DownloadMediaFile(fileHandle);
        }
        else if (fileHandle.IndexOf("id=", StringComparison.OrdinalIgnoreCase) >= 0)
        {
            this.DownloadMediaById(fileHandle);
        }
        else if (flag || Context.IsAdministrator)
        {
            this.DownloadFile(fileHandle);
        }
    }
}

如您所见,最后一个 if 块有一个 IsAdministrator 检查,这将是您的非管理员用户被阻止的地方。

虽然我还没有 100% 验证这是问题所在,但下载限制问题可以通过创建一个继承 Sitecore.Shell.DownloadPage 的新类并根据需要使用一些额外的安全检查覆盖 OnLoad 实现来解决。我建议您不要完全删除 IsAdministrator 检查,因为它的存在是有充分理由的。更新 download.aspx 中的 Inherits 属性,使其改为使用它。

于 2014-09-18T06:58:21.237 回答