WindowsAzureでホストされている.NET4.5クレーム対応アプリケーションがあります。MVCサイトをホストするWebロールと、バックグラウンドでジョブを実行するワーカーロールがあります。ユーザーは、永続的にログインしたままにすることを選択できます。
これが私のClaimsAuthenticationManagerからのコードです:
public ClaimsPrincipal LogIn(string username, bool rememberMe = false)
{
ClaimsPrincipal principal = Authenticate(null, principalFactory.CreateFormsPrincipal(username));
SetSessionCookie(principal, rememberMe ? TimeSpan.MaxValue : TimeSpan.FromDays(1));
return principal;
}
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
return principalFactory.Create(incomingPrincipal.Identity.Name, incomingPrincipal.Identity.AuthenticationType);
}
private static void SetSessionCookie(ClaimsPrincipal principal, TimeSpan lifetime)
{
var sessionSecurityToken = new SessionSecurityToken(principal, lifetime)
{
IsReferenceMode = true
};
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken);
}
ユーザーがサイトでアクション(サブスクリプションの購入/キャンセルなど)を実行する単純な更新の場合、これは次の方法で実行できます。
- 新しいトークンを発行してCookieを再書き込みするか
- ユーザーをログアウトして(Cookieを削除して)再認証してもらう
私がいくつかのガイダンスを必要としているのは、ユーザーが発生したものではないイベントの結果としてユーザーのクレームが変更されたときに、ユーザーのクレームを更新する方法とタイミングです。
次のシナリオを想像してみてください。
ユーザーが「rememberme」を指定し、正常にログインします。彼は今、期限切れになることのないクッキーを持っています。次に、サイトを介してサブスクリプションを購入します。彼の主張は、上記のオプション#1を介して更新されます。1か月後、更新しないことを選択したため、サブスクリプションは失効します。しかし、彼のCookieはまだ有効であり、それに関連するクレームは、彼のサブスクリプションがまだアクティブであると述べています。
新しいユーザーがアカウントを作成し、「rememberme」を指定して正常にログインします。彼は現在、有効期限が切れないCookieを持っています。これには、いくつかの特別な機能の1週間の無料トライアルを許可するクレームが含まれています。1週間後、バックグラウンドジョブ(ワーカーロールを介して実行)により、基になるデータストアの無料トライアルのレコードが削除されます。ただし、ユーザーのCookieには引き続き無料試用の申し立てがあります。
どちらのシナリオでも、ユーザーが自分でログアウトして再度ログインすると、問題は自然に解決します。ただし、ユーザーがログアウトするための特定のアクションを実行しない場合、ユーザーのCookieには無効なクレームが含まれています。
このようなケースをどのように処理しますか?
私がこの質問を作成しているときに、最も論理的なことは、Cookieの有効期限をクレームコレクション内の最短のクレームの意図された有効期間に設定することであることに気付きました。
より良いまたは異なる戦略はありますか?
任意のガイダンスをいただければ幸いです。
ありがとう。
参考までに、関連トピックに関する次の投稿を読みました。