2010-01-31 13 views
11

저는 여러 하위 도메인 subone.parent.com, subtwo.parent.com이있는 앱이 있습니다.ASP.NET 하위 도메인 쿠키 (상위 및 하위 도메인)

[email protected]에서 로그온 페이지가 있습니다. 사용자가 로그인하면 해당 도메인이 속한 도메인을 기반으로 적절한 도메인으로 리디렉션됩니다. 이것은 잘 작동합니다.

FormsAuthenticationTicket ticket = new FormsAuth... 
string encTicket = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
cookie.Domain = subone.parent.com 
Response.Cookies.Add(cookie) 

이렇게하면 subtwo.parent.com이 아니라 subone.parent.com에 대해 사용자를 올바르게 인증합니다. 그러나 나는 다음과 같이하고 싶다.

사용자가 parent.com으로 돌아 가면 해당 사용자가 로그인되어 있고 subone.parent.com으로 다시 리디렉션되고 있음을 알고 싶습니다.

이 작업을 수행하는 것이 가장 좋습니다. 아니면 parent.com에 다른 쿠키를 설정해야합니까?

중요한 경우 asp.net mvc에서 작업하고 있습니다.

THanks!

답변

5

도메인 전체에 걸쳐 쿠키를 공유 할 수는 있지만 간단하지는 않습니다 (예 : here).

다른 옵션은 명시 적으로 하위 도메인을 지정하지 않고 쿠키를 ".parent.com"으로 설정하고 쿠키 저장소에 하위 도메인의 세부 정보를 사용하는 것입니다. 그런 다음 하위 도메인 (및 해당 상위 www.parent.com 가정 부모)에서 쿠키에 액세스 할 수 있습니다.

MVC를 사용하는 경우 사용자 정의 필터를 쉽게 만들고 www.parent.com 컨트롤러에 추가하여 쿠키의 존재 여부를 확인할 수 있습니다. 쿠키가 있으면 하위 도메인으로 리디렉션합니다. 필터에 대한 자세한 내용은 here입니다.

+0

나는 두 번째 생각 옵션이 작동 할 수 있습니다. 부모에게 도메인을 설정하고 있습니다. FormsAuthTicket 사용자 데이터에 하위 도메인을 추가했습니다. 나는 IsAuthenticated에서 현재 도메인을 Userdata와 비교할 CustomIdentity를 만들었습니다. 어떻게 생각해? – Paul

+0

15seconds의 링크가 더 이상 .. .. –

0

특정 도메인의 쿠키 내에 보안 정보를 유지하기 때문에 명시 적 도메인의 쿠키를 설정합니다. * .parent.com 수준에서 인증되지 않은 도메인에 대한 정보가 들어있는 암호화되지 않은 쿠키를 추가 할 수도 있습니다. 어쩌면 타임 스탬프를 사용하지 않고 응용 프로그램간에 논리적 연결을 사용하지 않고이 두 가지를 함께 묶을 실제 방법이 없습니다 (즉, sub2는 세션 시간 초과가 20 분이므로 도메인 + 유효 시간 소인이 상위 쿠키에서 발생하면 유효 할 것입니다. 그러나 이것은 비즈니스 논리입니다).

도메인 간의 연결이 해제 된 이유는 확실하지 않지만 사실 암호화 된 텍스트 뒤에 암호화 된 텍스트가있는 단일 쿠키를 선호하는 경우가 있습니다. EG :

1) Sub1 로그인하면 parent.com 쿠키가 유효한 것으로 설정됩니다. 인증 웹 서비스에 사용자 데이터를 보냅니다.

2) 인증 서비스는 sub1을 보낸 사람으로 인식하고 사용자 데이터를 암호화 한 다음 사용자 지정 쿠키 개체에 추가합니다.

3) 사용자 지정 쿠키 개체는 고유 한 분할 문자 (또는 시퀀스)에 복합 문자열을 구성하고이를 서비스 메서드에서 사용할 수 있도록합니다.

4) 서비스는 양식 암호화를 사용하여 전체 티켓을 암호화하고 원래 로그인으로 다시 보냅니다.

그런 식으로 각 서버는 글로벌 티켓을 암호화 할 수 있지만 데이터의 각 부분은 일반적인 알고리즘을 사용하지만 서버 기반의 소금을 사용하여 암호화됩니다. 따라서 sub2가 sub1에서 쿠키 데이터를 읽으려고하면 원시 데이터가 아니라 암호화 된 버전을 얻습니다.

+0

고맙습니다. 암호화되지 않은 사용자 쿠키를 .parent 수준에 추가하면 다른 하위 도메인에 액세스 할 수 있도록 변경/스푸핑 할 수 없습니까? – Paul

+0

@Paul : 일종의. 암호화의 2 단계를 제안합니다. 첫 번째는 전체 쿠키를 * .parent.com 도메인에 비공개로 유지하는 기본 FormsAuthentication 암호화입니다. 두 번째는 쿠키가 마스터 서버와 개별 서버간에 만 알려진 쿠키의 각 개인 섹션에 적용되는 내부 암호화입니다. 각 하위 도메인은 전체 쿠키에 액세스 할 수 있지만 다른 하위 도메인에 속한 섹션은 해독 할 수 없습니다. FormsAuthentication.IsAuthenticated는 "true"값을 갖습니다. –

+0

@Paul : 계속 - 염두에두고이 체크를 실제 쿠키 자체의 데이터를 검증하는 것으로 보완해야합니다. IsAuthenticated && MyCookieData.IsValid (티켓) 또는 이와 비슷한 것. –

0

모든 하위 도메인에서 동일한 세션을 공유 할 수 있습니다. 즉, 우리를 Page_Load 방법 안에 그 :-)

void MasterPage_Unload(object sender, EventArgs e) 
{ 
    ///ASP.NET uses one cookie per subdomain/domain, 
    ///we need one cookie for _all_ subdomains. 
    if (Context.Response.Cookies["ASP.NET_SessionId"] == null) 
     return; 

    var sessionCookie = new HttpCookie("ASP.NET_SessionId", Context.Session.SessionID); 
    sessionCookie.Domain = ".yourdomain.com" ; 
    Context.Response.SetCookie(sessionCookie); 
} 

을 수행하는 데 사용하는 코드입니다 :

Unload += MasterPage_Unload; 

작동 큰 :-)

로버트

+0

로버트 감사합니다,하지만 나는 모든 하위 도메인, 하나의 루트에 대한 사용자 인증을 원하지 않습니다. – Paul

+0

우리는이 솔루션에 심각한 문제에 봉착했습니다. 그 코드로 MasterPage를 사용하는 모든 페이지에서 'OutputCache'가 작동하지 않게되었습니다. [This solution here] (http://stackoverflow.com/a/2088853/177710)는 OutputCache를 charme처럼 작동하게했습니다. – Oliver