2011-08-22 5 views
8

ASP.NET FormsAuthentication의 흥미로운 기능은이 SO 답변에서 설명합니다. How do you pass an authenticated session between app domainsEnableCrossAppRedirects - 도메인 간 기능은 어디에 문서화되어 있습니까?

요약 요약 : 동일한 암호화 키를 사용하여 두 개의 ASP.NET 웹 사이트를 만들 수 있습니다. WebsiteA는 formsauth 토큰을 만들고 쿼리 문자열 (또는 POST 본문)에있는 토큰을 사용하여 WebsiteB로 리디렉션 할 수 있습니다. WebsiteB의 EnableCrossAppRedirects를 켜면 ASP.NET이 토큰을 감지하고 formsauth 쿠키를 만듭니다. 코드에서 :

FormsAuthentication.RedirectFromLoginPage("alice", true); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted); 

소리는 훌륭한 특징이지만 어디에서 문서화되어 있습니까? 나는 비트 문서화되지 않은 기능을 사용하여 불안감을 느낍니다.

어디에서 보았습니다 - MSDN 참조에서이 기능에 대한 언급이 없습니다. 아마도 RedirectFromLoginPage가 위의 코드처럼 리디렉션을 작성할 것이라고 생각합니다. 그렇지 않습니다.

답변

14

대한 서브 도메인에 생성 한 쿠키 아무 것도 반사기 보았다 갖는 그럼 기계 키 형태의 (다소 불법) 특징이있다 인증. EnableCrossAppRedirects이 활성화되면 .NET은 인증 쿠키를 찾는 것 외에도 양식 게시 또는 쿼리 문자열에서 폼 인증 "쿠키"를 추출하려고 시도합니다. 이 코드는 ExtractTicketFromCookie 메서드의 FormsAuthentication 클래스에 포함되어 있으며 요청 데이터에서 인증 쿠키를 찾으려는 시도가 명확하게 표시됩니다. 당신이 두 응용 프로그램에 EnableCrossAppRedirects을 사용하는 경우

if (FormsAuthentication.EnableCrossAppRedirects) 
{ 
    text = context.Request.QueryString[name]; 
    if (text != null && text.Length > 1) 
    { 
     if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
     { 
      cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
     } 
     try 
     { 
      formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
     } 
     catch 
     { 
      flag2 = true; 
     } 
     if (formsAuthenticationTicket == null) 
     { 
      flag2 = true; 
     } 
    } 
    if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired) 
    { 
     text = context.Request.Form[name]; 
     if (text != null && text.Length > 1) 
     { 
      if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
      { 
       cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
      } 
      try 
      { 
       formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
      } 
      catch 
      { 
       flag2 = true; 
      } 
      if (formsAuthenticationTicket == null) 
      { 
       flag2 = true; 
      } 
     } 
    } 
} 

은 따라서 다음 첫 번째 응용 프로그램은 외부 사이트로 리디렉션 할 수있는 권한, 두 번째 응용 프로그램이 자동으로 요청에서 인증 쿠키에 읽습니다. 반환 로그인 URL이 쿠키 데이터를 게시하거나 쿼리 문자열에 보냅니다. 또한 컴퓨터 키가 동기화되었는지 또는 외부 앱 컴퓨터 키 (첫 번째 앱에서)를 사용하여 쿠키가 암호화되어 있는지 확인해야합니다. 기본적으로 .NET은 사용자를 위해 쿼리 문자열에 암호화 된 인증 쿠키를 보내고 컴퓨터 키가 동기화되어 있다고 가정합니다 (아래 MSDN 인용문 참조).

여기 좀 더 info on MSDN입니다.

CookiesSupported 속성이 true이고, ReturnUrl 변수 중 하나가 현재 응용 프로그램 내에 또는 EnableCrossAppRedirects 속성이 true이면

는 다음 같이 RedirectFromLoginPage 메서드는 인증 티켓 및 기본 쿠키 장소가 사용을 발행 SetAuthCookie 메서드.

CookiesSupported가 false이고 리디렉션 경로가 현재 응용 프로그램의 URL 인 경우 티켓은 리디렉션 URL의 일부로 발행됩니다. CookiesSupported가 false의 경우, EnableCrossAppRedirects 사실이며, 리디렉션 URL은 현재 응용 프로그램 내에서 페이지를 참조하지 않습니다는 같이 RedirectFromLoginPage 메서드는 인증 티켓 및 쿼리 문자열 특성에서 장소를 발행합니다.

보안에 대한 큰 경고가 있습니다. EnableCrossAppRedirects은 ASP.NET 로그인 컨트롤이 외부 반환 URL (다른 웹 응용 프로그램)로 리디렉션되지 않도록하는 보안 설정입니다. 이 설정을 사용하면 일부 공격 형태로 악용 될 수 있습니다. 즉, 사용자는 공식 로그인 페이지로 보내지 만 로그인하면 동일한 것으로 믿을 수있는 다른 응용 프로그램으로 리디렉션됩니다. 이것이 기본적으로 사용 중지 된 이유입니다.

하나는 기능을 사용하는 경우 다음과 같이이 문제를 완화하는 방법 :

는 응용 프로그램 간 리디렉션을 사용할 때 보안을 향상 시키려면 리디렉션에게 단지에 승인 된 웹 사이트를 허용하도록 같이 RedirectFromLoginPage 메소드를 오버라이드 (override) .

은 또한 차단 사람이 계정의 관리 권한을 획득 할 수있을 것 같은 리디렉션 요청, 운송에서 "쿠키"를 보호하기 위해 SSL을 통해 제공됩니다 확인해야합니다.

+0

죄송합니다. 내 대답이 수정되었습니다. 양식 쿠키 또는 양식 문자열을 자동으로 선택하는 .NET의 숨겨진 기능이 있습니다. 방금 새로운 것을 배웠습니다! – TheCodeKing

+0

좋은 답변입니다! 그래서 나는 '쿠키 없음'인증 기능을 파괴하고 있습니다. 재 보안 위험 : RedirectFromLoginPage를 사용하지 않기 때문에 사용자가 리디렉션되는 위치를 제어합니다. SSL을 통한 리디렉션 - POST/쿼리 문자열의 토큰은 formsauth 쿠키보다 덜 안전합니다. 가장 안전한 방법은 SSL을 통해 전체 웹 사이트를 배치하는 것입니다. – russau

+0

BTW - 왜 커뮤니티 위키입니까? 내가 그 상을 수여받을 때도 현상금을받을 수 있겠 니? – russau