2012-03-02 33 views
0

有効なユーザがシステムにログインしてログアウトせずにブラウザを終了すると、時折(つまり、直後ではなく、翌日に)、そのディレクトリまたはページを表示する権限がありません。ユーザーはシステムにログインして次のものを投げます。ASP.NET:403 - 禁止:アクセスが拒否されました。

エラー:403 - アクセスが拒否されました。指定した資格情報を使用して、このディレクトリまたはページを表示する権限がありません。このquestion

は同じ問題を参照するが、彼の溶液中で、彼は希望ソリューションではありませんFormsAuthenticationTicketを作成する際のパラメータとしてを渡すことで、永続的なCookieを使用しないことを決めました。

private void createCookie(string username, int customerID, bool persist) 
{ 
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(username, persist); 
    cookie.Expires = DateTime.Now.AddHours(12); 
    var ticket = FormsAuthentication.Decrypt(cookie.Value); 
    var userData = customerID.ToString(); 
    var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userData); 
    cookie.Value = FormsAuthentication.Encrypt(newTicket); 
    Response.Cookies.Add(cookie); 
} 

これを解決する方法上の任意のアイデアを:

これは私がクッキーを作成していますどのようにでしょうか?

+0

、私はあなたがこのコンパクトな形で認証Cookieを作成しようとすることを示唆している: 'FormsAuthentication.SetAuthCookie(ユーザー名、持続);' それはストレートフォワードはるかだし、それはあなたの問題を解決する可能性があります、たとえそうでなくても、はるかにクリーンでコンパクトです。 –

+0

@OferZeligあなたが提案したように、クッキーにcustomerIDの値を追加することは可能ですか? – aleafonso

+0

私はそれについては分かりませんが、私は他のことをやっています:現在の 'MembershipUser'を取得し、自分のデータベースから、またはメンバーシップユーザーの' Comment'プロパティからIDを取得します。 –

答えて

0

auth cookieに独自のuserDataを組み込むことに固有の問題はありません。 は、当社のウェブサイトの一つで、我々はasp.netログインコントロールを使用し、多くの成功と、次のイベントリスナーを追加します。

protected void Login1_LoggedIn(object sender, EventArgs e) 
    { 
     //... unimportant code left out 

     //Update the users ticket with custom userInfo object 
     string userData = userInfo.Id.ToString("N"); 
     HttpCookie cookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName); 
     FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(cookie.Value); 
     FormsAuthenticationTicket newTicket = 
      new FormsAuthenticationTicket(
       oldTicket.Version, 
       oldTicket.Name, 
       oldTicket.IssueDate, 
       oldTicket.Expiration, 
       oldTicket.IsPersistent, 
       userData, 
       oldTicket.CookiePath); 
     cookie.Value = FormsAuthentication.Encrypt(newTicket); 
} 
1

せず、有効なユーザシステムにログインし、ブラウザを閉じてログアウト、それは時折(すなわち後で 翌日ではないすぐに)私は密である可能性が

...バックシステムにログインするユーザーを防止するが、コードはあなたの方法のように動作していませんそれを実装しましたか?

つまり、:cookie.Expires = DateTime.Now.AddHours(12);を指定します。これは、Cookieが発行されてから12時間後に有効期限が切れることを示します。

Asp.net 1.0の場合、FormsAuthenticationTicket.IsPersistentが設定されている場合、チケットの発行有効期間は自動的に50年です。

Asp.net 2.0では、これはもはや該当しません。 FormsAuthenticationTicket.IsPersistentがfalseに設定されている場合、チケットの有効期間はSessionのタイムアウト期間と同じになります。 FormsAuthenticationTicket.IsPersistentがtrueに設定されている場合、有効期間はデフォルトでフォーム認証タイムアウト属性になります。有効期限は12時間を足した時間に設定されているため、12時間後にチケットが停止すると予想されます。あなたがAsp.net 2.0+を使用していると仮定すると、うまくいけば、これはあなたが見ている幸福を説明するはずです。私はより長い期間に有効期限を長くし、問題がなくなるかどうかを確認することをお勧めします。スタートのために

+0

ありがとうございます。これがクッキーの期限が切れる理由です。しかし、私はまだログインしようとすると、「403 - 禁止:アクセスが拒否されました。あなたが指定した資格情報を使ってこのディレクトリまたはページを表示する権限がありません。代わりに、私はそれが再びクッキーを作成すべきだと思います。どう思いますか? – aleafonso

関連する問題