asp.net (3.5) アプリケーションでフォーム認証を使用しています。また、ロールを使用して、どのユーザーがアプリのどのサブディレクトリにアクセスできるかを定義しています。したがって、私の web.config ファイルの関連セクションは次のようになります。
<system.web>
<authentication mode="Forms">
<forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies" />
</authentication>
<authorization >
<allow users="*"/>
</authorization>
</system.web>
<location path="Admin">
<system.web>
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
私が読んだことに基づいて、これにより、管理者ディレクトリにアクセスできる唯一のユーザーは、認証されて管理者ロールが割り当てられたユーザーになることが保証されます。
ユーザー認証、認証チケットの保存、およびその他の関連する問題はすべて正常に機能します。タグを web.config ファイルから削除すると、すべて正常に動作します。問題は、管理者の役割を持つユーザーのみが管理者ディレクトリにアクセスできるように強制しようとしたときに発生します。
このMS KB 記事と同じ情報を提供する他の Web ページに基づいて、次のコードを Global.asax ファイルに追加しました。
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
if (HttpContext.Current.User != null) {
if (Request.IsAuthenticated == true) {
// Debug#1
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
// In this case, ticket.UserData = "Admin"
string[] roles = new string[1] { ticket.UserData };
FormsIdentity id = new FormsIdentity(ticket);
Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
// Debug#2
}
}
}
ただし、ログインしようとすると、Admin フォルダーにアクセスできません (ログイン ページにリダイレクトされます)。
問題をデバッグしようとして、リクエストをステップ実行すると、上記の Debug#1 とマークされた行で Context.User.IsInRole("Admin") を実行すると、false が返されます。行 Debug#2 で同じステートメントを実行すると、true になります。したがって、少なくとも Global.asax に関する限り、Role は適切に割り当てられています。
Global.asax の後、実行はログイン ページに直接ジャンプします (役割がないため、admin フォルダー内のページの読み込みが拒否されるため)。ただし、ログインの Page_Load の最初の行で同じステートメントを実行すると、false が返されます。そのため、Global.asax の Application_AuthenticateRequest と制限されたディレクトリの WebForm の初期ロードの後のどこかで、ロール情報が失われ、認証が失敗します (注: Page_Load では、適切な認証チケットがまだ Context.User.Id に割り当てられています)。 - 役割だけが失われています)。
私は何を間違っていますか、どうすれば正しく動作させることができますか?