2014-10-28 2 views
-1

내가 Global.asax에Global.asax를 사용하여 별도의 사용자에 대한 인증을 저장하는 방법은 무엇입니까?

public static MemberManager.Member _CurrentUser; 

나에게 문제가 다른 요청 (그들은 서로 같은 시간에 검색하면 다른 사용자가 인증을 훔칠 수)와 공유된다에 정적 변수를 만들었습니다. 이 코드를 다른 요청과 공유하지 않음으로써이 코드를 어떻게 해결할 수 있습니까? 수정하기 위해 요청 직전과 요청 완료 후 멤버를 지우는 것.

요청이 완료되고 요청이 시작된 직후에 제거하여 작동하게 만들 수있는 것. 나는 그것이 효과가 있을지 확신하지 못한다.

누군가가 제대로 작동하는지 확인할 수 있습니다. 요청간에 currentUser 변수를 공유하고 싶지 않았습니다. 이 코드는 작동 여부를 결정합니다.

+0

이걸로 뭘하고 싶니? – avidenic

답변

1

정적 필드를 사용하지 마십시오. 정적 클래스 필드는 동일한 AppDomain에서 실행되는 모든 코드 (모든 스레드)가 공유합니다. 이 개체를 세션에 저장하십시오.

public static MemberManager.Member _CurrentUser 
{ 
    get 
    { 
    return (MemberManager.Member)System.Web.HttpContext.Current.Session["__MemberManager_Member"]; 
    } 
    set 
    { 
    System.Web.HttpContext.Current.Session["__MemberManager_Member"] = value; 
    } 
} 
+0

세션에 대한 네임 스페이스를 찾지 못했습니다. 요청 전후에 멤버를 지우더라도 다른 멤버와 공유하고 있습니까? – Adrian

+0

나는 현재 요청 문맥에서 가져온'Session'으로 답을 갱신했다. 예, 다른 사용자의 요청이 동시에 처리되기 때문에 여전히 공유됩니다. – Igor

1

왜 인증을 저장해야합니까?

폼 인증을 사용하십시오. 사용자는 모든 요청시 인증 키와 함께 쿠키를 보냅니다. 로그인 행동에

추가 속성은 익명 호출 할 수 있도록 :

[AllowAnonymous] 
public virtual ActionResult Login(string username, string password) 
{ 
    //login logic here 
} 

사용자 이름 및 암호 로그인 동작 점검을하고, 그들이 올바른 있다면 수행

FormsAuthentication.SetAuthCookie(username, isCookiePersistent); 

아웃 사용자를 기록하려면 , 통화 (로그 아웃 작업)

FormsAuthentication.SignOut(); 

글로벌 필터를 등록 할 때 다음과 같이 "AuthorizeAttribute"를 등록하십시오 :

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{    
    filters.Add(new AuthorizeAttribute()); 
} 

그리고 완료되었습니다! 사용자는 "AllowAnonymous"속성으로 꾸며주는 것을 제외한 모든 통화에 로그인해야합니다.

편집 : 현재 로그인 한 사용자를 추적하려면 캐싱을 선택하십시오. 가장 기본적인 것은 "InMemory"이지만 캐시를 파일, 별도의 프로세스 또는 원하는 경우 DB에 저장할 수 있습니다.

관련 문제