2015-01-28 2 views
0

this 자습서를 사용하여 기본 인증으로 웹 API 호출을 보호합니다. 기본적으로 요청에 인증 헤더가 있는지 확인한 다음 데이터베이스에 대해이 헤더를 증명합니다.기본 인증 최적화 : 후속 요청에 대한 사용자 인증 저장

public static bool CheckPassword(string user, string password) 
{ 
    //Do a Database checkup 
    if(CheckDB(user,password)) { 
     //if true, set the principal 
     var identity = new GenericIdentity(user); 
     SetPrincipal(new GenericPrincipal(identity,null)); 
    } 
    else { 
     //return 401... 
    } 
} 
private static void SetPrincipal(IPrincipal principal) 
{ 
    Thread.CurrentPrincipal = principal; 
    if (HttpContext.Current != null) 
    { 
     HttpContext.Current.User = principal; 
    } 
} 

이것은 정상적으로 작동합니다. 하지만 내가하는 모든 요청에 ​​대해 데이터베이스를 쿼리합니다. JavaScript 파일을 요청한 경우에도 마찬가지입니다.

이 프로세스를 최적화하고 첫 번째 요청시 CheckDB()을 호출하기를 원합니다. 다음 요청은 다른 데이터베이스 요청이 필요하지 않아야합니다. 교장을 구제하는 것이 가능합니까? Thread.CurrentPrincipal을 확인하려고했으나 모든 요청에 ​​대해 다시 초기화해야합니다.

답변

1

당신은 몇 가지 옵션이 있습니다 : 당신은 사용자의 상대적으로 적은 수의 단 하나의 기계 처리 요청 간단한 토폴로지가있는 경우

  1. 하면 사용자 이름과 암호의 메모리에 캐시를 구현할 수를 당신 후속 호출을 효율적으로 검증하는 데 사용할 수 있습니다. 이 접근법에 대한 보안 고려 사항이 있지만 (항상 암호가 항상 메모리에 있어야하는가?) 사용자 명을 제외하고 암호를 제공하는 ConcurrentDictionary와 같은 것을 사용하여 구현할 수 있습니다.
  2. 사용자 이름/암호 쌍의 유효성을 검사 한 후에 쿠키를 설정하십시오. 쿠키에는 사용자 이름/암호의 유효성을 다시 검사해야하는 타임 스탬프, 서버가 알고있는 (그리고 타임 스탬프를 설정했는지 확인하는 데 사용할 수있는) 해시와 같은 종류의 해시가 포함될 수 있습니다.

이러한 접근 방식 중 하나를 사용하면 "CheckPassword"방법은 암호를 캐시의 암호와 비교하거나 쿠키를 검사하여 결과가 만족 스러우면 데이터베이스를 호출하지 않고 직접 새 보안 주체를 직접 만듭니다.