アプリケーションに、入力パラメータを受け取るカスタム AuthorizeAttribute がありますbool UserIsOnline
。このパラメータは、最後のユーザー インタラクションの時間に関する情報を保持するテーブル フィールドを増やすために使用されます。つまり、裏で実行されるajax リクエストの場合は 値を指定false
し、通常のリクエストまたはユーザーが開始した ajax リクエストの場合はtrue
値を指定します。
これはほとんどの場合機能しますが、常に機能するとは限りません。これはスレッドセーフではないことを読みましたが 、処理される前に別のプロセスによって変更されるため、このパラメーターが間違っているのではないかと考えています。この問題を解決するにはどうすればよいですか?このアクションに AuthorizeAttribute を使用すべきではありませんか?AuthorizeAttribute
UserIsOnline
public class MyAuthorizeAttribute : AuthorizeAttribute
{
private MyMembershipProvider _provider = new MyMembershipProvider(); // this class is thread-safe
private bool _userIsOnline = true;
public bool UserIsOnline { get { return _userIsOnline; } set { _userIsOnline = value; } }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
// Check if user is authenticated
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
// Check that the user still exists in database
MyMembershipUser myUser = (MyMembershipUser)_provider.GetUser(user.Identity.Name, _userIsOnline);
if (myUser == null)
{
// User does not exist anymore, remove browser cookie
System.Web.Security.FormsAuthentication.SignOut();
return false;
}
return true;
}
}