2010-12-16 4 views
16

HttpWebRequest를 통해 다른 서버에 GET 요청을 보내는 ASP.NET MVC 작업이 있습니다. 새 요청에서 원래 작업 요청에 모든 쿠키를 포함하고 싶습니다. 원래 요청의 System.Web.HttpCookies 중 일부에 빈 도메인 값 (예 : "")이있어 문제가 발생하지 않는 것 같습니다. 이름, 값, 경로 및 각 쿠키의 도메인을 사용하여 System.Net.Cookie를 만들고이를 요청의 CookieContainer에 추가하면이 오류가 발생합니다.빈 도메인이있는 HttpWebRequest 쿠키

"System.ArgumentException : {0} '빈 문자열이 될 수 없습니다 매개 변수 이름 :. cookie.Domain "여기

이 (쿠키가 추가 될 때) 같은 오류가 발생합니다 일부 코드입니다 :

var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com"); 
request.Method = "GET"; 
request.CookieContainer = new CookieContainer(); 
request.CookieContainer.Add (new Cookie ("MyCookieName", "MyCookieValue", "/", "")); 

편집

I 일종의 원래 HttpCookie의 null 또는 빈 문자열 값 대신 도메인에 "localhost"를 사용하여이를 수정했습니다. 따라서 쿠키 도메인에 빈 도메인이 작동하지 않는 이유는 무엇입니까? HttpCookie는 빈 값을 사용하여 localhost를 나타 냅니까? 아니면이 문제에 대한 다른 수정을 찾아야합니까?

+1

정확히 무엇을하려합니까? 다른 서버에 요청을 보낼 때 컨테이너에 도메인 "localhost"가있는 쿠키를 설정해도 작동하지 않습니다. 쿠키는 전송되지 않습니다. 시나리오를 설명하고 달성하려는 목표를 설명 할 수 있다면 더 나은 해결책이 제시 될 것입니다. – feroze

+0

크로스 사이트 스크립팅을위한 패스 스루 페이지를 만드는 것처럼 들리겠습니까? 아래에 배경 정보가 포함 된 답변을 게시 해 드리겠습니다. 지금 어떻게 작동하는지 https://en.wikipedia.org/wiki/HTTP_cookie를 확인하십시오. 도메인은 매우 중요합니다. – BrainSlugs83

+0

@Angelisho는 아래의 좋은 대답을 가지고 있습니다. 나는 그의 대답을 찾기 전에 나의 시험에서 같은 결론에 도달했다. 기본적으로 : request.Headers.Add (HttpRequestHeader.Cookie, "MyCookieName = MyCookieValue"); – Brain2000

답변

-1

쿠키를 localhost로 보내려고합니다. 맞습니까?

왜 당신은 당신이 당신의 자신의 컴퓨터 실제 이름 줄 같은 것을하지 않는다 :

  1. 을 편집 호스트 파일 및 사용하여 라인 "127.0.0.1 myname.com"
  2. 테스트를 추가를 myname.com - 실제로 귀하의 로컬 호스트입니다.

브라우저 또는 앱에서 차이점을 알 수 없으며 쿠키가 myname.com에있는 경우 쿠키를 전송합니다.

상세 정보 :

  1. 호스트가 C에 위치 창에 파일 : \ WINDOWS \ system32를 \ 드라이버 \ 등 \ 호스트
+0

빈 도메인은 쿠키를 보낼 도메인이 아니기 때문에 사용할 수 없습니까? –

9

면책 조항 :

로 @feroze에 의해 이전에 언급 된 것처럼, 쿠키의 도메인을 localhost로 설정하는 것은 당신을 위해 그렇게 잘되지 않을 것입니다. HTTP 요청을 외부 도메인으로 터널링 할 수있는 도우미를 작성하고 있다고 가정합니다. 이는 권장 사항이 아니며 많은 경우에 필요하지 않습니다 (예 : jQuery has a lot of cool cross-domain support built-in, 새로운 CORS specification 참조). 그러나 때로는이 작업을 수행하지 못하는 경우가 있습니다. 즉, 외부 리소스는 XML이고 CORS를 지원하지 않는 서버에 있습니다.

배경 쿠키 도메인에 대한 정보와 작동 방법 :

이미 HTTP Cookie: Domain and Path on Wikipedia 살펴하지 않은 경우 - 당신이 거기에 알아야 할 거의 모든 것을.

쿠키를 평가

는 도메인 및 경로 에 의해 고려 모두 클라이언트 (이하 "지역"요청자) 및 웹 서버 (이하 "외국인"응답). 클라이언트가 리소스를 요청하면 클라이언트 이 요청한 URI의 도메인 (또는 더 일반적인 주소 : parent domain) 및 경로 (또는보다 일반적인 상위 경로)와 일치하는 쿠키 만 보내야합니다.

웹 브라우저가 올바르게 처리합니다. 웹 브라우저에 도메인 "localhost"에 대한 쿠키가 있고 "google.com"을 요청하는 경우 "google.com"에 대한 요청에서 "localhost"도메인에 대한 쿠키가 전송되지 않습니다. - 실제로 대부분의 최신 브라우저는 쿠키를 보내지 않고받을 수있는 Set-Cookie 응답 헤더에서이를 무시합니다 (이러한 쿠키를 제 3 자 쿠키라고합니다. 웹 브라우저는 거대한 개인 정보 보호/보안 문제입니다 -하지 마세요!).

다른 방향으로도 작동합니다. 클라이언트가 요청에 제 3 자 쿠키를 포함 할 가능성은 없지만 외부 웹 서버가 요청한 경우 해당 쿠키를 무시해야합니다. 올바른 도메인/경로를 사용하여 악의적 인 super-cookie 문제를 방지하십시오 (예 : "example.com"을 호스팅하는 웹 서버는 상위 도메인에 속한 쿠키 인 ".com"을 무시해야합니다. ".com"은 "public suffix")).

당신은 [당신이있는 경우에] 할일 :

내가 당신을 위해 추천 행동의 과정, 당신은 내가 MVC 사람 아니에요 (고객의 쿠키를 읽을 때이지만, 일반에 ASP.NET은 Request.Cookies에있을 것입니다), 루프를 통과 시키십시오 (자신의 사이트의 합법적 인 쿠키, 특히 SessionId 등을 필터링하거나 경로를 올바르게 사용하여 처음부터이 페이지로 보내지 않도록하십시오) 그런 다음 한 번에 하나씩 발신 요청의 쿠키 컬렉션에 추가하고 도메인을 "www.whatever.com"으로 다시 작성하십시오 (예를 들어,이 작업을 동적으로 수행하는 경우 URL을 새 Uri()로로드하십시오) 개체를 사용하고 .Host 속성을 사용) 경로를 "/"로 설정합니다. - 외부 웹 서버로 나가는 요청의 "쿠키"헤더를 만듭니다.

요청이 서버로 돌아 오면 새로운 쿠키에 대한 수신 응답을 확인해야합니다. 이전 쿠키에서 설명한 것과 같은 루프 유형으로 쿠키를 다시 패키징하여 클라이언트로 되돌릴 수 있습니다 단락을 제외하고는 Host를 Request.Url.Host로 다시 작성하려는 경우를 제외하고 패스 쓰루 페이지의 경로가 정적이 아닌 한 경로를 "/"로 다시 설정해야합니다 (나는 추측하고 있지 않습니다). MVC를 사용하고 있기 때문에이를 예를 들어 Request.Url.AbsolutePath로 설정하고 싶을 것입니다.

해피 코딩!

편집 : 당신이 당신의 웹 서버를 생각하지 않는 호출하고있는 웹 사이트가 쓰레기를 스팸 됐어요 하나의 클라이언트가되도록 또한 , 당신이 보내는 요청의 X-Forwarded-For 태그를 설정할 수 있습니다 그들의.

2

일부 배경

CookieContainer가 클라이언트 측 다수의 HttpWebRequest에서 재사용 할 수 있도록 설계 컨테이너 있기 때문에이 발생합니다. 다시 사용하면 원격 호스트에서 설정 한 쿠키가 동일한 호스트를 대상으로하는 모든 후속 HttpWebRequest와 함께 보내질 것으로 예상되는 쿠키 동작을 제공합니다.

재사용 결과 CookieContainer에는 실제로 여러 요청 및 호스트의 쿠키가 포함될 수 있습니다.

따라서 특정 HttpWebRequest와 함께 컨테이너의 쿠키 중 일부를 일부 호스트 (도메인)로 보내야하는지 확인하기 위해 CookieContainer는 Domain 및 Path 속성을 검사합니다.

CookieContainer CookieContainer에있는 쿠키는 유효한 도메인이 있어야합니다.

반대로, 서버 측에 쿠키 다른 형태를 통해 전달되며, CookieCollection있는 별도의 로직 쿠키의 단순리스트. CookieContainer에 CookieCollection에서 쿠키를 복사하는 동안 HttpWebRequest를가 알 수 있도록


특히, 귀하의 경우, 당신은 당신의 요청을 전달하려고하는 도메인에 대한 모든 쿠키의 도메인 속성을 설정해야합니다 요청을 보내는 동안 쿠키를 포함하십시오.

1

문제가 해결되지 않았는지 확인하십시오. 그러나 "Domain"속성없이 쿠키를 추가하려면 다음과 같이 HttpRequestHeader.Cookie을 사용하여 쿠키를 헤더에 추가해야합니다.

request.Headers.Add(HttpRequestHeader.Cookie, "Your cookies..."); 

희망 하시겠습니까?

+0

이 방법은 경로 또는 도메인을 시도하거나 추측 할 필요없이 웹 요청을 할 때 쿠키를 작동시키는 유일한 방법이라는 것을 알았습니다. 같은 것을 찾은 것처럼 보입니다. – Brain2000