特定の Excel ファイルへのアクセスを特定のユーザーのみに許可する方法を探しています。
これはシナリオです:
フォーム認証を行う ASP.Net 4 アプリケーションがあります。増え続ける Excel ファイルのセットに多くのユーザーがアクセスできるようにしたいと考えています。各ユーザーは、いずれかのセットへのアクセスが許可されます。
ユーザーが表示できる Excel ファイルへのハイパーリンクのみを表示するナビゲーション ページを簡単に配置できます。ただし、URL を推測することで、他のファイルも取得できます。
次のシナリオを試してみました: すべての Excel ファイルのベース フォルダーを設定し、その中に各ユーザーのフォルダーを配置します。各フォルダーには、web.config ファイルが配置されます。メイン フォルダーには、次のものが含まれます。
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</configuration>
各サブフォルダーは次のとおりです。
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow users="<username>" />
</authorization>
</system.web>
</configuration>
これは、フォルダー内のすべての .aspx ファイルに対しては適切に機能しますが、Excel ファイルなどの他の種類のリソースに対しては機能しません。それらへのアクセスは常に許可されます。これは、これらのファイルが ASP.Net ワーカー プロセスによって処理されないことが原因であると考えられます。
正しいユーザーのみにアクセスを手配するにはどうすればよいでしょうか? ASP.Net アプリケーションの仮想ディレクトリの外に Excel ファイルを保存し、Response ストリームを使用して Excel ファイルを出力する ServeExcel.aspx ページを作成することを考えています。これを行うためのより良い方法はありますか?
追記、BrOSsさんのコメントを受けて
「チュートリアル: メンバーシップとユーザー ログインを使用した Web サイトの作成」を読み、テスト サイトを作成しました。すべての手順に従う代わりに、空のプロジェクト テンプレートからではなく、ASP.Net Web アプリケーションから開始し、手順「メンバー専用ページの作成」のウォークスルーに追いつきました。「新しいユーザーの追加」のステップまでそれをフォローしました。ユーザー 'member' にはフォルダー Membership へのアクセスが許可され、別のユーザー 'visitor' にはこのフォルダーへのアクセスが拒否されました。チュートリアルの手順に加えて、「ユーザーを拒否する」というアクセス ルールを追加しました。
Web アプリケーションを実行すると、メンバー ページ ~\MemberPages\Members.aspx は、「訪問者」ではなく「メンバー」に表示されます。
その後、test.xls ファイルをMemberPagesフォルダーに配置します。驚いたことに、このファイルへのアクセスは「訪問者」(および匿名ユーザー) にも拒否されます。
2013 年 1 月 3 日に追加されたメモ: 上記で Excel ファイルを保護する本当の理由は、内部の Visual Studio 開発サーバーを使用したためです。サーバーでは IIS が使用され、既定では IIS 自体が Excel ファイルを提供します。ISAPI フィルターの構成を変更して IIS 6.0 および 7.5 の構成を変更しようとしましたが、最終的にこれは構成の誤りに敏感であるように思われたため、Joe によって提案された解決策を適用しました。
これは、私自身の Web アプリケーションでの私の経験との大きな違いであり、プロジェクト間に大きな違いがあることを発見しました。
私のプロジェクトは ASP.Net メンバーシップを使用していませんが、カスタム ユーザー テーブルを使用しています。また、カスタム コードは global.asax.vb ファイルに存在します。
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
If (Not (HttpContext.Current.User Is Nothing)) Then
Dim objLogin As New Person(ConfigurationManager.AppSettings("DBConnection"))
objLogin.AuthenticateUser(HttpContext.Current.User.Identity.Name)
Dim strRoles(10) As String
strRoles(0) = "user"
Dim objPrincipal As New System.Security.Principal.GenericPrincipal(objLogin, strRoles)
Context.User = objPrincipal
System.Threading.Thread.CurrentPrincipal = objPrincipal
End If
End Sub
注: Personクラスは System.Security.Principal.IIdentity インターフェイスを実装します。テスト プロジェクトで同様のコードが実行されるかどうかはわかりませんが、少なくとも Global.asax.cs ファイルや Login.aspx.cs ファイルでは同様のコードは実行されません。
プロジェクトにデバッガーをアタッチしたところ、aspx ファイルの要求ごとに Application_AuthenticateRequest が実行され、毎回 HttpContext.Current.User が何もないことがわかりました。Excel ファイルのリクエスト中に、このコードは実行されません。これが、web.config 承認設定による制限なしでファイルが提供される理由だと思います。
私は別の投稿を見つけました: ASP.NET でのオブジェクトの永続化 (ポストバック間) で、それを詳しく調べて、それが私を助けることができることを確認します。
それでも、多くのプロジェクトで使用される一種のフレームワーク ASP.Net アプリケーションにカスタム機能を追加するコードを書いているので、global.asax ファイルを変更することは許容範囲外になると思います。したがって、私はまだ ServeExcel.aspx/ashx オプションを検討しています。