문제

저는 Asp.net(MVC이지만 실제로는 중요하지 않음) 애플리케이션을 개발 중입니다.사용자 주체 및 ID를 변경하기 위해 PostAuthenticateRequest를 담당하는 사용자 지정 IHttpModule이 있습니다.

사용자가 로그인할 때 인증 쿠키에 UserID와 UserName을 저장하고 있습니다.비즈니스 서비스 클래스 전체에 필요한 IUser(DAO 및 비즈니스 개체 계층으로 구현되며 각각 고유한 추가 멤버가 있음)가 있습니다.사용자가 원하는 것이 있으면 IUser 개체 인스턴스(일반적으로 Business Objects 레이어에서)를 제공해야 하므로 인증 티켓에서 ID를 제공하는 것만으로는 충분하지 않습니다.

그래서 로그인한 사용자의 IUser 데이터를 유지하는 가장 좋은 방법과 위치를 생각하고 있습니다.

  1. DB에서 매번 가져오고 싶지 않음 (인증 티켓의 UserID 데이터 기준)
  2. 세션이 아직 준비되지 않은 PostAuthenticateRequest 내부에서 작업해야 하기 때문에 세션에 저장할 수 없습니다.
  3. 모든 기능을 내 사용자 정의 IHttpModule 내에 캡슐화하고 싶습니다.

내가 보는 선택사항:

  • 은닉처
  • 쿠키
  • (세션) - PostAuthenticateRequest에서 PostAcquireRequestState 이벤트로 이동하고 거기에서 주체/ID를 변경하지만 이를 피하고 싶습니다.

상황이 복잡해 보이는 프로세스는 다음과 같습니다.

  1. 사용자 로그인, 사용자 데이터는 DB에서 가져오고 이후 요청을 위해 어떻게든 유지됩니다.
  2. 사용자 로그아웃, 사용자 데이터는 지속 매체에서 자동으로 제거되어야 함
  3. 사용자가 자신의 프로필을 변경하면 사용자 데이터를 삭제하고 다음 DB 요청 시 다시 읽어야 합니다.

개발자가 이러한 사항을 재설정하는 것을 잊어버리는 오류를 제거하기 위해 HttpModule에서 이러한 모든 항목을 자동으로 처리하는 것을 원하지 않습니다(가능한 경우).

또한 내가 원하지 않는 것은 일부 하드코딩된 변수/키를 쓰거나 읽고 이를 애플리케이션의 다른 부분에서 조작하는 것입니다.이는 기술적인 부채만을 나타낼 뿐입니다.

질문

  1. 무엇을 제안하시겠습니까?
  2. SO는 요청 간에 사용자 데이터를 어떻게 유지합니까?
도움이 되었습니까?

해결책

귀하의 요구 사항을 고려할 때 가장 좋은 해결책은 쿠키에서 ID를 검색하고 이를 사용하여 Http 캐시(HttpContext.Current.Cache)에 대한 색인을 생성하는 것입니다.

사용자가 액세스하는 방법을 유지하려면 캐시를 "UserCache" 개체로 래핑하세요.객체는 HttpModule에 의해 생성될 수 있으며 캐시 자체 내에 (잠깐만 기다려주세요...) 싱글톤으로 저장되거나 더 나은 방법은 http 캐시에서 가져와야 할 때 생성될 수 있습니다.이는 액세스해야 하는 위치와 HttpContext.Current.Cache를 직접 사용할 수 있는지 여부에 따라 달라집니다.게으른 구현은 다음과 같습니다.

다시 말하지만 이는 명확성을 위한 것이며 실제로 구현하는 방법은 아닙니다.

public class UserCache
{
  public IUser GetUser(object userKey)
  {
    return HttpContext.Current.Cache[userKey];
  }

  public void AddUser(object userKey, IUser user)
  {
    /* this could pull the key from the user object as well. */
    HttpContext.Current.Cache.Add(/* add the object with key and a sliding expiration that is slightly greater than session timeout */);
  }

  public void ExpireUser(object userKey)
  {
    HttpContext.Current.Cache.Remove(userKey);
  }

  /* If you don't want to do SQL cache dependency */
  public void UpdateUser(object userKey, IUser user)
  {
    HttpContext.Current.Cache.Insert(/* ... */);
  }
}

기본 캐싱 메커니즘(또는 구현에 얽매이지 않도록 DI에서 제공하는 캐싱 메커니즘이 더 좋음)을 사용하면 설명에 언급된 대로 캐시에서 사용자를 자동으로 제거하도록 만료를 설정할 수 있습니다.SQL Server 업데이트에 종속되도록 캐시를 설정하고 업데이트를 처리하거나 서비스의 일부로 수동으로 업데이트하여 변경 사항을 저장할 수 있습니다.

기본 캐시에 대한 자세한 내용을 확인할 수 있습니다. 여기.에 대한 추가 정보 캐시 종속성 사용할 수 있습니다 여기.

HttpModule 자체에서는 EndRequest 이벤트에서 몇 가지 마법을 수행하여 요청이 인증되었는지 확인한 다음 쿠키를 기반으로 사용자를 로그아웃시킬 수 있다고 가정합니다. 하지만 시도해 본 적이 없기 때문에 이것이 작동할지는 확실하지 않습니다. 그것.당신은 한 번보고 싶을 수도 있습니다 이 기사 1.1일 전에 WAY의 MSDN을 방문하여 해결하려는 문제 중 일부에 대한 답변이 있는지 확인하세요.

SO 아키텍처와 그 수행 방식에 관해서는 대부분의 데이터베이스를 항상 RAM에 유지하기 때문에 필요할 때 이를 로드한다고 생각합니다(http://highscalability.com/stack-overflow-architecture).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top