Sitecore文件下载仅适用于管理员用户

时间:2013-04-01 13:35:33

标签: sitecore sitecore6

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

不是像以前那样将文件放在任意位置,而是将它放在temp目录中,如下所示:

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文档,它看起来很好。

我在Sitecore发行说明中发现了6.6:

  

发布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帐户都有阅读,列表和&对temp文件夹的读取/执行权限以及各个文件显示为read&同时读取/执行这两个帐户的权限。

如何允许非管理员用户下载这些文件?在6.6中修复的bug是否与它有关?

谢谢。

1 个答案:

答案 0 :(得分: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属性,使其改为使用它。