2012-08-30 4 views
2

내 응용 프로그램에 입력 매개 변수 bool UserIsOnline을 사용하는 사용자 지정 AuthorizeAttribute가 있습니다. 이 매개 변수는 마지막 사용자 상호 작용 시간, 즉 false을 제공하고 정규 요청 또는 사용자가 시작한 ajax 요청 인 true 값을 제공하는 아약스 요청에 대한 정보를 보유하는 테이블 필드를 늘리는 데 사용됩니다.AuthorizeAttribute 및 매개 변수

대부분의 경우에는 작동하지만 항상 그런 것은 아닙니다. I've read thatAuthorizeAttribute이 thread가 안전하지 않기 때문에이 UserIsOnline 매개 변수가 처리되기 전에 다른 프로세스에 의해 수정되기 때문에 이것이 잘못된 것인지 궁금하게 생각합니다. 이 문제를 해결하려면 어떻게해야합니까? 이 작업에 AuthorizeAttribute를 사용하지 않아야합니까?

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

답변

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 
    } 
+0

사용할 수있는 솔루션은 모든 아약스 요청은 사용자의 지식없이 수행되는 것을 가정 , 그것은 나를 위해 사실이 아니다. 이 질문에 대해보다 정확한 답변을 드릴 것입니다 ... –