요청을하는 것과 다른 세션에서 Inproc ASP.NET 세션을 포기할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/257843

문제

CAS (Centralized Authentication Server)를 사용하여 단일 사인온을 수행하는 응용 프로그램이 있습니다. 사용자가 하나의 응용 프로그램 (프론트 엔드 포털)에서 로그인하면 동일한 단일 로그온 티켓을 사용하여 모든 응용 프로그램에서 자동으로 사인을 받도록 단일 사인 아웃을하고 싶습니다.

각 응용 프로그램은 해당 응용 프로그램에 로그온 할 때 CAS와 함께 가입 후크 (URL)를 등록 할 것으로 예상됩니다. CAS가 응용 프로그램 중 하나에서 사인 아웃 요청을 받으면 SSO 티켓을 공유하는 모든 애플리케이션에 대한 가입 후크를 호출합니다.

내 질문은 이것입니다 : 다른 세션에서 임대 세션을 포기하는 방법이 있습니까? HTTP 요청이 CAS 서버에서 나올 것이기 때문에 자체 세션이 발생하지만 종료하려는 사용자의 세션이라고 생각합니다. 별도의 세션 상태 서버를 사용 하여이 작업을 수행하는 방법에 대해 잘 알고 있지만 Inproc 세션 상태를 사용하는 것이 가능하는지 알고 싶습니다.

도움이 되었습니까?

해결책 2

약간의 파기를하고 지금까지 제공된 답변을 고려한 후에는 Inproc 세션을 계속 사용할 수있는 대안을 제시했습니다. 기본적으로, 이미 싱글 사인온을 감지 된 CAS 로그 아웃에 처리하고 브라우저를 응용 프로그램 로그 아웃 페이지로 리디렉션하는 HTTPModule을 확장하는 것으로 구성됩니다.

개요:

서명하다:

  1. 각각의 새로운 단일 사인온 요청에 대해 새 SSO 쿠키를 생성하고 IT에서 고유 한 값을 인코딩하여 세션을 식별하십시오 (세션 ID가 아님).
  2. 식별자로 인코딩 된 가입 콜백 URL을 구성하고 CAS 서버에 등록하십시오.

사인 아웃 :

  1. CAS 서버에서 가입 요청이 수신되면 식별자를 디코딩하고 응용 프로그램 전체 캐시에 저장하십시오. 이것은 세션이 자연스럽게 만료 될 수있을 정도로 캐시에 고정해야합니다.
  2. 각 요청에 대해 SSO 쿠키를 찾아 캐시 된 가입 세션 식별자에 대한 값을 확인하십시오. 히트가 있으면 SSO 쿠키를 제거하고 브라우저를 응용 프로그램의 가입 URL로 리디렉션하십시오.
  3. 각 가입에 대해 SSO 쿠키가 있는지 확인하십시오. 그렇다면 가입 요청을 CAS에 전달하십시오. 어쨌든 사용자 세션을 포기하고 응용 프로그램에서 사인하십시오.

page_load :

  1. SSO 쿠키의 존재를 확인하십시오. 하나가 없으면 로그 아웃 페이지로 리디렉션하십시오.

다른 팁

하하, 글쎄 ... 당신이 할 수있는 것 같아요. 나는 이것을 할 방법이 있는지 궁금해했다.

InProc을 사용하면 InProcSessionStatestore (내부 클래스)는 내부 (비 공개) 캐시에서 세션 상태를 관리합니다. 반사를 통해이 캐시에 액세스하고 세션 상태를 수동으로 제거 할 수 있습니다.

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

최종 결과는 다음 요청이 동일한 SessionID를 사용하지만 httpsessionState는 비어 있습니다. 여전히 session_start 및 session_end 이벤트를 얻을 수 있습니다.

Inproc SessionState를 사용하면 데이터에 액세스 할 수 없습니다 ... StatesErver를 사용하면 세션을 제거하기 위해 올바른 API에 액세스하려는 끈적 끈적한 시나리오가 있습니다.

사전 포장 된 SQLServer State 제공 업체와 같은 데이터베이스 후원 상태 솔루션 또는 DOTS와 같은 타사 솔루션을 사용하려고합니다. http://codeplex.com/dotss

데이터베이스 후원 솔루션을 사용하면 세션 ID에 의해 테이블에서 상태 레코드를 조회하고 완료된대로 표시 할 수 있습니다. 이 기술은 선택한 공급자에 따라 다릅니다.

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