2

編集者がボタンをクリックして Word ドキュメントを生成できる Sitecore 6.4 セットアップがあります。ファイルをメディア ライブラリに追加していましたが、問題なく動作していました。編集者がコンテンツ エディターのボタンをクリックすると、ファイルが生成され、メディア アイテムが生成されます。コンテンツ エディターはメディア ライブラリに新しいアイテムを表示し、編集者はリボンまたはアイテムの「ダウンロード」ボタンをクリックします。をクリックしてダウンロードします。ただし、メディア ライブラリが不必要にいっぱいになっていたため、メディア ライブラリをバイパスしようとしています。

以前のようにファイルを任意の場所に作成する代わりに、次のように一時ディレクトリに配置しています。

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 の両方のアカウントには、一時フォルダーに対する読み取り、一覧表示、および読み取り/実行のアクセス許可があり、個々のファイルには、これら 2 つのアカウントの読み取りと読み取り/実行のアクセス許可も表示されます。

管理者以外のユーザーがこれらのファイルをダウンロードできるようにするにはどうすればよいですか? 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 に答える