フォーム認証で奇妙な問題が発生しています。独自のカスタム プリンシパルと ID クラスがあり、サインイン後、HttpContext.Current.User をこのプリンシパルに設定し、キャッシュ (HttpContext.Current.Cache) に格納します。しばらくすると、奇妙な行動が始まるようです。これは私の AuthenticateRequest ハンドラです:
protected void Application_AuthenticateRequest( object sender, EventArgs e ) {
string userName;
var formAuthCookie = HttpContext.Current.Request.Cookies[ FormsAuthentication.FormsCookieName ];
var isAuthenticated = HttpContext.Current.Request.IsAuthenticated;
if ( isAuthenticated || formAuthCookie != null ) {
if ( !isAuthenticated ) {
var ticket = FormsAuthentication.Decrypt( formAuthCookie.Value );
userName = ticket.Name;
}
else {
userName = HttpContext.Current.User.Identity.Name;
}
var prin = (IPrincipal)HttpContext.Current.Cache[ userName ];
if ( prin != null ) {
HttpContext.Current.User = prin;
}
}
}
これは常に正常に機能します。カスタム プリンシパルがキャッシュから取得され、現在のコンテキストのユーザーに正しく設定されます。
問題は、ページの読み込み時に、Page.User プロパティに GenericPrincipal (ロールなし) と FormsIdentity があることです。これがどこで起こっているのかわかりません。もちろん、ユーザーが適切なロールにないため、ページは機能しませんが、FormsAuth はユーザーをロール制限ページに入れました。
AuthenticateRequest ハンドラーで設定したプリンパルが置き換えられる理由はありますか?