1

フォーム認証で奇妙な問題が発生しています。独自のカスタム プリンシパルと 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 ハンドラーで設定したプリンパルが置き換えられる理由はありますか?

4

1 に答える 1

-1

代わりにこれを試してください:

var formAuthCookie = Context.Request.Cookies[ FormsAuthentication.FormsCookieName ]; 
var isAuthenticated = Context.Request.IsAuthenticated; 

if ( isAuthenticated || formAuthCookie != null ) { 
    if ( !isAuthenticated ) { 
        var ticket = FormsAuthentication.Decrypt( formAuthCookie.Value ); 
        userName = ticket.Name; 
    } 
    else { 
        userName = Context.User.Identity.Name; 
    } 

    var prin = (IPrincipal)Context.Cache[ userName ]; 

    if ( prin != null ) { 
        Context.User = prin; 
    } 
} 
于 2012-04-05T14:44:46.863 に答える