내 응용 프로그램에 입력 매개 변수 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;
}
}
사용할 수있는 솔루션은 모든 아약스 요청은 사용자의 지식없이 수행되는 것을 가정 , 그것은 나를 위해 사실이 아니다. 이 질문에 대해보다 정확한 답변을 드릴 것입니다 ... –