2

アプリケーションに、入力パラメータを受け取るカスタム AuthorizeAttribute がありますbool UserIsOnline。このパラメータは、最後のユーザー インタラクションの時間に関する情報を保持するテーブル フィールドを増やすために使用されます。つまり、裏で実行されるajax リクエストの場合は 値を指定falseし、通常のリクエストまたはユーザーが開始した ajax リクエストの場合はtrue値を指定します。

これはほとんどの場合機能しますが、常に機能するとは限りません。これはスレッドセーフではないことを読みましたが 、処理される前に別のプロセスによって変更されるため、このパラメーターが間違っているのではないかと考えています。この問題を解決するにはどうすればよいですか?このアクションに AuthorizeAttribute を使用すべきではありませんか?AuthorizeAttributeUserIsOnline

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;
  }
}
4

1 に答える 1

1

パラメータを完全にスキップして使用できますhttpContext.Request.IsAjaxRequest

public class MyAuthorizeAttribute : AuthorizeAttribute
{
  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;
    }

    if (!httpContext.Request.IsAjaxRequest()) 
    {
         // do your thing in the DB
    }
于 2012-09-21T20:07:17.500 に答える