0

우리는 한동안 단일 인스턴스에서 실행되는 웹 역할을 가지고 있습니다. 더 높은로드에 대처하고 더 나은 SLA를 얻으려면 현재 여러 인스턴스를 지원하는 역할을 마이그레이션하고 있습니다.Azure 세션 테이블은 AspProvider의 TableStorageSessionStateProvider에서 비워 두었습니다

역할은 사용자 지정 멤버 자격 공급자와 함께 폼 인증을 사용하며 사용자가 인스턴스간에 일종의 공유 세션 상태를 설정해야한다는 것을 이해 했으므로 사용자가 인스턴스 1에서 로그인하여 자신의 .ASPXAUTH 그러면 인스턴스 2는이 쿠키에 대해 알고 있습니다.

우리는이를 수행했으며 현재이 역할은 두 개의 인스턴스에서 실행되고 있으며 모든 것이 잘 작동합니다. 사용자가 로그인 한 인스턴스가 아닌 다른 인스턴스에서 요청을 처리하더라도 사용자가 로그인 한 상태로 테스트했습니다. 사용자가 로그인하지 않으면 액세스가 거부되었습니다.

우리는 또한 TableStorageSessionStateProvider이 푸른 표 스토리지 계정에 테이블을 생성 여부를 확인하고, 실제로 PartitionKey, RowKeyTimestamp 열이있는 테이블 Sessions있다.

그러나 놀랍게도 Sessions 테이블은 항상 비어 있습니다. 얼마나 많은 사용자가 로그인되어 있더라도 테이블에 데이터가 없습니다.

Sessions 테이블을 통하지 않으면 이러한 인스턴스는 어떻게 통신 할 수 있습니까? 인증세션 상태 :

답변

2

현재 다른 두 가지를 혼합하고 있습니다.

여러 인스턴스에서 세션 상태를 사용하려면 공유 저장소가 필요합니다 (InProc가 작동하지 않음). 이 경우 TableStorageSessionStateProvider은 모든 인스턴스가 여기에 저장된 세션 데이터에 액세스 할 수 있기 때문에 작동합니다. 세션 상태는 장바구니와 같이 사용자의 현재 세션에 항목을 저장할 때 사용됩니다. 그리고 당신은 이것을 다음과 같이 부를 것입니다 : Session["UserShoppingCart"] = shoppingCart;.

하지만 질문에 설명하는 내용은 세션 상태와 아무 관련이 없습니다. 폼 인증과 관련이 있습니다. 인스턴스 1에서 인증을하면 답장으로 티켓을받습니다 (.ASPXAUTH 쿠키에 저장 됨). 이 티켓은 암호화되고 서명되며 사용자 이름, 만료일, 사용자 정의 사용자 데이터 등과 같은 기본 정보를 포함합니다 ...

이제 여러 인스턴스가 있으므로 다음 요청이 인스턴스 2에 도착할 수 있습니다. 문제는 인스턴스가 어떻게 통신합니까? 글쎄, 그들은하지 않습니다. 요청이 시작될 때마다 FormsAuthenticationHttpModule이 페이지 또는 컨트롤러에 도달하기 전에 시작되어 .ASPXAUTH 쿠키를 찾습니다. 서명을 검사하고 해독 한 다음 HttpContext.Current.User를 쿠키 (티켓)의 정보로 채 웁니다.

유일한 인스턴스 사이의 링크는 machineKey (쿠키를 암호화/해독/서명/유효성 검사에 사용됨)입니다. Windows Azure에 여러 인스턴스를 배포 할 때마다 패브릭 컨트롤러는 all instances get the same machineKey으로 설정합니다. 이렇게하면 인스턴스 2는 인스턴스 1에 의해 암호화되고 서명 된 티켓의 암호를 해독하고 유효성을 검사 할 수 있습니다.

+0

감사합니다. – cheeesus