【问题标题】:Sitecore file download works only for admin userSitecore 文件下载仅适用于管理员用户
【发布时间】:2013-04-01 13:35:32
【问题描述】:

我有一个 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 Update-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修复的bug和这个有关系吗?

谢谢。

【问题讨论】:

  • 非管理员用户点击它时会发生什么?是否显示或记录错误消息?另外,您是否检查过所涉及项目的 Sitecore 权限?
  • 您最好按照安德鲁的建议检查权限。这不可能是工作进程用户(IUSR等)的权限问题,或者管理员用户无法更轻松地触摸它,所以这是一个死胡同。

标签: sitecore sitecore6


【解决方案1】:

调用 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 属性,使其改为使用它。

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 2018-08-29
    • 2020-02-18
    • 1970-01-01
    • 2015-03-03
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多