0

1 つの列に画像が含まれるグリッドビューがあります。クリックした画像をズームするためにライトボックスを使用しました。しかし、画像を右クリックして「リンクを新しいタブで開く」オプションを選択すると、画像が新しいタブで開かれます。それは問題ではありません。

その後、ログアウトボタンを押します。その画像リンクをコピーしてアドレスバーに貼り付けると、同じ画像が開かれます。最初にユーザーがログインしているかどうかを確認し、ログインしている場合は画像を開く必要があります。グリッドビューのすべての画像は、「製品画像」という名前のフォルダーに保存されます。

gridviewを利用しているページでログイン状況を確認しています。何をするか教えてください。

4

2 に答える 2

1

問題は、画像にセキュリティ トリミングが適用されていないことです。

静的リソースは asp.net ページと同じルートをたどらないため、セキュリティ トリミングは画像に適用されません。

その画像フォルダーに無許可のユーザーを許可しない web.config ファイルがある限り、web.config => system.webServer => modulesで設定することで問題を処理できます

<modules runAllManagedModulesForAllRequests="true">

...しかし、これは、すべてのリソースが asp.net パイプラインを介してルーティングされることを意味し、パフォーマンスの問題が発生する可能性があります。

あなたの質問に答えて(私の解決策):

私は実際には別の方法をとりますが、それはもう少し難しいでしょう:

  • iis Request Filtering (=> Hidden Segments => Disallow access to that folder) を使用して、フォルダの製品画像をどのユーザーにも見えないようにします。
  • 次に、イメージ名をパラメーターとして持つカスタム http ハンドル (.ashx ファイル) を作成します。ProcessRequest のそのハンドラーは画像パラメーターを取得し、特定のファイルを開き、画像からデータを応答にストリーミングします。)
  • ログインしていないユーザーがハンドラーにアクセスできないように、ASP.NET パイプラインを通過する限り、その処理はセキュリティ トリミングの下で​​簡単です。パフォーマンスは多少遅くなりますが、これらの特定の画像に対してのみです。また、画像への直接呼び出しを変更する必要があることに注意してください。たとえば、src='/product images/imageA.png'があった場合、これはsrc='/ImagesHandler.ashx?image=imageA.png'に変更する必要があります。

難易度とAbhishek Punjの回答についてのコメントの後、私は言及したいと思います:

  • 私のソリューションでは、ファイルの種類ごとにハンドラーを登録する必要はありません (後で .jpg ファイルの種類を追加し、それを登録していない場合はどうでしょうか?)。

  • また、Abhishek Punj の回答を使用しても、画像ファイルから画像データをストリーミングして応答する必要があります。

  • さらに、私のソリューションでは、ProcessRequest でユーザーのアクセス許可をカスタム チェックする必要はありませんが、ASP.NET セキュリティ トリミングで処理できます。

  • また、私のソリューションは、Abhishek Punj が「ファイルの種類をグローバルに保護」しようとする「フォルダーを保護」しようとします。

  • しかし、最も重要なのは、Abhishek Punj の回答は、すべての画像が ASP.NET パイプラインを通過することを意味します。つまり、たとえば、ログオン フォームに画像があった場合、それらはユーザーにも表示されません! 結局のところ、すべての画像ファイル タイプを処理するのであれば、コーディングせずに runAllManagedModulesForAllRequests="true" を使用しないのはなぜでしょうか?

于 2013-10-05T09:30:17.540 に答える