フォーム認証Cookieが機能しなくなったようです
-
06-07-2019 - |
質問
アプリケーションに、ユーザーが無期限にログを記録したいことを確認できる機能を持ちたい(Cookieの有効期限をNOWから3か月に任意に設定する)。
これに対処するためのコードは
private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse,
bool persistCookie)
{
var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie);
if (persistCookie)
cookie.Expires = DateTime.Now.AddMonths(3);
return cookie;
}
private void LoginUser(string userNameResponse, bool PersistCookie)
{
Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie));
string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse,
PersistCookie);
Response.Redirect(navigateAfterUrl);
}
ただし、後でサイトに戻ったときに、再度ログインする必要があります。 Cookieが有効期限とともに戻ってきて、セッションCookieとして設定されていないことを確認しました(ブラウザーを閉じたり再開したりしてもCookieが存在することをテストしました)。私の考えでは、ASP.NETがセッションを期限切れにしたときに何か関係があると思います。
web.configに特定のマシンキーが設定されているので、IISが再起動された場合などに同じCookieが機能しませんか?誰もこれを引き起こしている可能性について、または少なくともこれをトレースする方法について少なくとも何か提案を持っていますか?私は他に何もすることができないので。
解決
GetAuthCookie メソッドを呼び出すと、 FormsAuthenticationTicket は、タイムアウト web.configのプロパティ。必ず適切に設定してください:
<authentication mode="Forms">
<forms
loginUrl="/someloginUrl"
requireSSL="true"
protection="All"
// This is the setting you are looking for! (it's in seconds)
timeout="120"
domain="example.com"
slidingExpiration="false"
name="cookieName" />
</authentication>
チケットが暗号化されると、Cookieの値として使用されます。 Expires プロパティを設定すると、指定された値へのCookieは、指定された期間、クライアントコンピューターに保持されることを示します。その後、ASP.NETランタイムはリクエストごとにCookieの存在を確認し、値を復号化してチケットを取得しようとします。次に、Timeoutプロパティを使用してチケットがまだ有効であるかどうかを確認します。タイムアウトが短い場合、Cookieがまだ送信されているにもかかわらず、チケットは無効になり、認証は失敗します。