2

SSL이 혼합 된 웹 응용 프로그램 (asp.net 3.5)이 있습니다. 모든 계정 관련 페이지는 SSL을 통해 제공됩니다. 대부분의 다른 페이지는 non-ssl을 통해 전달됩니다. HTTPS와 HTTP 사이를 자동으로 전환하려면 this component을 사용하십시오. 최근 비보안 Wifi 네트워크에서 사용자 세션을 도용하는 기능에 관한 뉴스 항목이있었습니다. 이것은 비 SSL 연결을 통해 전송되는 쿠키를 포착하여 가능해야합니다.asp.net은 requireSSL을 사용하고 비 SSL 페이지에서 사용자가 인증되었는지 계속 확인할 수 있습니다.

이 웹 응용 프로그램에서 내 보안 선택 사항을 검토하게되었습니다. 나는 (다시) MSDN에서 this article을 얻었고 requireSSL = true 내 Formsauthentication 속성을 시도했습니다. Webapplication을 시작하기 전에이 정보가 포함 된 쿠키가 웹 브라우저와주고받지 않기 때문에 User.Identity가 비 SSL 페이지에서 null이된다는 것을 알았습니다.

SSL 연결을 통해 사용자를 인증하는 메커니즘이 필요하며 비 SSL 페이지에서도이 인증 정보를 기억합니다.

SO 검색 중에 this post을 찾았습니다. 이것이 나에게 좋은 해결책이라고 생각됩니다. 하지만 솔루션이 Sessionstate에 로그인 정보를 저장하는 과정에서 발견 될 수 있을지 궁금합니다. 나는 Global.asax에서 Application_AuthenticateRequest를 잡을 생각이다. 연결이 안전한지 확인하고 authcookie 또는 Session을 확인하십시오. 나는 이것을 어떻게 구현할 것인지 정확히 알지 못한다. 이걸 가지고 나랑 생각할 수 있을까?

답변

3

불행히도, 당신은 충돌하는 요구 사항이 있습니다. 비 SSL을 통해 보안 세션을 가질 수 없으므로 기본 가정에 도전하고 싶습니다. 전체 사이트에서 SSL을 사용하지 않는 이유는 무엇입니까?

+0

안녕하세요 Brad, 답장을 보내 주셔서 감사합니다. 우리가 http와 https를 섞은 두 가지 이유. 첫째, 이미지도 전자 메일 메시지에 제공되는 응용 프로그램입니다. HTML 전자 메일 메시지에 사용되는 이미지는 호환성 문제로 인해 HTTPS를 통해 보내지 않는 것이 좋습니다. 또한 비 SSL 연결을 통해 이러한 이미지를 제공하기 때문에 사용자에게 혼합 된 콘텐츠를 허용할지 묻는 팝업이 응용 프로그램 내에 표시됩니다.메시지 된 전자 메일과 동일한 이미지가 응용 프로그램 내에서 사용됩니다. – JonHendrix

+0

두 번째로, 자산 (CSS, JS, 이미지 등)은 SSL을 통해 전달 될 때 캐시되지 않습니다. 즉, 모든 요청은 매번 많은 자산을 보냅니다. 비록 이것이 약간의 수정과 최적화를 통해 해결 될 수 있지만, 대부분의 리소스가 캐싱 될 때 응용 프로그램이 응답하고 더 잘 작동한다고 여전히 생각합니다. – JonHendrix

+0

저는 애플리케이션 자체에 대해서만 이야기하고 있습니다. 자산은 아닙니다. SSL 및 비 SSL 모두에서 이미지를 제공 할 수 있다는 것은 커다란 문제가 아닙니다. 제공되는 비 SSL 이미지가 인증을 필요로하지 않는다고 가정합니다 (전자 메일 메시지에 임베드되어 있기 때문에). , 나는 그들이하지 않는다고 생각하고있다). –

2

SSL을 사용하지 않는 속성을 요청하는 MVC FAQ (보안 전문가 인 Levi가 답변 한 비슷한 질문)에서.

• [RequireHttps] 특성은 컨트롤러 유형 또는 동작 방법에서 "SSL을 통해서만 액세스 할 수 있습니다"라고 말할 수 있습니다. 컨트롤러 또는 작업에 대한 비 SSL 요청은 SSL 버전 (HTTP GET 인 경우)으로 리디렉션되거나 거부됩니다 (HTTP POST 인 경우). RequireHttpsAttribute를 재정 의하여 원하는 경우이 동작을 변경할 수 있습니다. 그 반대쪽에는 [RequireHttp] 속성이 내장되어 있지 않지만 원하는 경우 쉽게 만들 수 있습니다.

또한 프로토콜 매개 변수를 사용하는 Html.ActionLink() 오버로드가 있습니다. 명시 적으로 "http"또는 "https"를 프로토콜로 지정할 수 있습니다. 이러한 과부하에 대한 MSDN 설명서가 있습니다. 프로토콜을 지정하지 않거나 프로토콜 매개 변수가없는 오버로드를 호출하는 경우 링크가 현재 요청과 동일한 프로토콜을 원한다고 가정합니다.

MVC에 [RequireHttp] 속성이 없다는 이유는 실제로 많은 이점이 없다는 것입니다. [RequireHttps]만큼 흥미롭지는 않습니다. 사용자에게 잘못된 행동을하도록 권장합니다. 예를 들어, 많은 웹 사이트는 SSL을 통해 로그인하고 로그인 한 후 다시 HTTP로 리디렉션합니다. 이는 절대적으로 잘못된 행동입니다. 귀하의 로그인 쿠키는 귀하의 사용자 이름 + 비밀 번호와 똑같은 비밀이며, 지금은 전선을 통해 일반 텍스트로 보내고 있습니다. 게다가 MVC 파이프 라인이 실행되기 전에 이미 핸드 셰이크를 수행하고 채널 (HTTPS를 HTTP보다 느리게 만드는 요소)의 보안을 유지해야하므로 [RequireHttp]가 현재 요청이나 미래를 만들지 않습니다 요청이 훨씬 빠릅니다.