문제

CDO 메시지 개체를 사용하여 보고서를 이메일로 보내는 웹 응용 프로그램이 있습니다.

예를 들어:

Dim objCDO
Set objCDO = Server.CreateObject("CDO.Message")
objCDO.CreateMHTMLBody "http://server/report.asp"

문제는 IIS에 요청할 때 로그인한 사용자의 ASP 세션 ID를 상속하지 않는다는 것입니다.콘텐츠에 대한 액세스를 허용하기 전에 요청을 인증하는 데 사용되는 세션 변수가 비어 있습니다.이로 인해 인증이 어려워지고 다음과 같이 쿼리 문자열 변수를 추가해야 합니다(보시다시피 이 요청에 양식 변수를 추가할 수 없기 때문입니다).

objCDO.CreateMHTMLBody "http://server/report.asp?userid=xx&password=xx"

요청이 로컬 컴퓨터에서 왔는지 확인하기 위해 보고서에 인증 방법이 반드시 있어야 합니다.메일러 스크립트에 CDO 개체가 포함되어 인증이 필요하지 않습니까?

도움이 되었습니까?

해결책

그냥 하지 마세요!이러한 이유들로:-

  • 서버에 다시 두 번째 요청을 하면 현재 스레드가 차단되고, 요청이 너무 많으면 애플리케이션이 교착 상태에 빠지게 됩니다.
  • CreateHTMLBody 내부에서는 WinINET http 스택을 사용하여 요청을 수행합니다.이 스택은 클라이언트 대화형 시나리오에서 사용하기 위한 것입니다.서버 시나리오에서는 스레드로부터 안전하지 않습니다.
  • 모든 세션 컨텍스트를 잃어버리면 (당신이 발견한 대로) 무언가를 더 어렵게 하거나 덜 안전하게 만들 수 있습니다.또한 원하지 않는 세션이 많이 생성될 수 있습니다.

그것이 사실이기는 하지만 CreateHTMLBody 매우 편리할 수 있으며 부풀어 오른 이메일을 만들 수도 있습니다.서버 상황에서는 이런 유혹적인 방법을 사용하기보다는 코드로 이메일을 작성해야 합니다.

편집하다

Jimbo는 CreateHTMLBody보다 더 일반적인 시나리오를 염두에 두고 있는 것 같습니다.일반적인 시나리오는 소비자가 제어할 수 없는 구성 요소가 ASP 페이지(이를 "클라이언트 페이지"로 지정)에서 사용하고 다른 ASP 페이지(아마도 WinINET을 통해)에 후속 요청을 하는 것입니다(우리는 이를 "클라이언트 페이지"로 지정함). 이를 "서비스 페이지"로 지정합니다)."클라이언트 페이지"가 ​​구성 요소 사용에 대해 제어할 수 있는 유일한 것은 제공된 URL뿐이라는 가정이 있습니다.

위에 설명된 문제를 피하거나 완화하기 위한 몇 가지 접근 방식은 다음과 같습니다.

잠금 문제 처리: "클라이언트 페이지"와 "서비스 페이지"를 다른 ASP 응용 프로그램에 배치하면 잠금 문제를 피할 수 있습니다.내 제안은 "클라이언트 페이지"를 나머지 응용 프로그램과 다른 응용 프로그램에 배치하고 이 새 응용 프로그램을 기본 응용 프로그램의 하위 폴더에 두는 것입니다.

WinINET 문제 처리: 새 응용 프로그램을 자체 응용 프로그램 풀에 배치합니다.안전하지 않은 방식으로 WinINET을 사용하면 문제가 발생하더라도 기본 응용 프로그램 프로세스에는 영향을 미치지 않습니다.실제로 이를 자체 프로세스에 배치하면 이러한 문제를 피하는 데 도움이 될 수 있습니다.(여기서는 보장할 수 없지만 WinINET 문제를 완전히 피할 수 있는 최선의 방법입니다).

보안 제어: "클라이언트 페이지"의 요청만 수락하도록 "서비스 페이지"를 구성합니다.이를 수행하는 방법은 여러 가지가 있을 수 있지만 가장 간단한 방법은 IP 기반 보안을 활성화하는 것입니다. "서비스 페이지"에 대한 요청은 특정 IP 또는 최소한 제한된 IP 주소 집합에서만 이루어져야 합니다.

인증 처리: 기본 애플리케이션 로그온 중에 고유한 값이 포함된 휘발성 쿠키를 만듭니다."클라이언트 페이지"는 브라우저에 의해 기본 애플리케이션의 하위 폴더로 인식되므로 이 쿠키를 받게 됩니다."클라이언트 페이지"는 이 쿠키를 사용하여 요청의 신뢰성을 확인하거나 구성 요소를 사용할 때 URL에 전달할 수 있습니다.

많은 세션 생성 억제: "서비스 페이지" 통화를 요청하세요. Session.Abandon 작업이 완료되기 전에.

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