2011-12-22 2 views
1

SSL을 사용해야하는 사이트가 있습니다. 비 SSL 프로토콜에서받은 요청을 SSL 프로토콜로 자동 전송하는 경로 또는 IIS 구성을 어떻게 설정합니까? 라우팅 규칙으로 처리 할 수있는 것이거나 제어기 자체가 아닌 메소드에서만 기본 제어기의 RequireHttps 속성을 사용하고 Index() 메소드에서 프로토콜을 감지하는 것이 가장 좋을까요?MVC3 : 비 SSL 요청을 SSL 프로토콜에 자동으로 라우팅하려면 어떻게해야합니까?

메모 : 나는 UrlRewriting과 IIS7의 응용 프로그램 요청 라우팅을 사용하는 this question을 읽었지만 IIS6로 인해 막혔습니다. 그리고 UrlRewriting은 나를위한 옵션이 아닙니다.

+0

에 http'에서 자동 리디렉션에 너무 많이 의존하지 마십시오

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new RequireHttpsAttribute()); } 
: //': HTTPS'에 //'브라우저가 여전히 (전체)를 만들 것이다 초기 리디렉션되기 전에 일반 HTTP를 통해 요청하십시오. 참조하십시오 : http://stackoverflow.com/a/8765067/372643 – Bruno

+0

@ 브루노 : 그것은 올바른 관심사, 그것을 지적 해 주셔서 감사합니다. 그것은 비록 그것이 단지 게시물을 받아들이 기 때문에 초기에 http로 접근 할 수있는 유일한 페이지가 원래의 로그인 일 것이기 때문에 제가 만들고있는 작은 사이트에는 영향을 미치지 않습니다. –

+0

그런 종류의 논리를 사용하지 말라고 조언합니다. 여러 가지 제한 사항을 제자리에서 찾아 다니면서 당신을 위해 일하게하려는 충동에 저항하는 것은 극히 어렵습니다. 보안 데이터와 보안되지 않은 데이터는 서로 절대적으로 격리되어야합니다. HTTPS를 사용하는 모든 것이 안전하든 그렇지 않든간에 안전합니다. HTTP를 사용하는 모든 것이 정의 상으로는 ... 암호화 된 데이터조차도 HTTP에서 안전하지 않습니다. 그런 식으로 터널을 사용할 때, 당신은 당신이 통제 할 수 있다고 생각할 수있는 보안 구멍을 열지 만, 위에서 설명한 원칙에 위배됩니다. – jinzai

답변

1

이것은 우리가 사용하는 것입니다. 그것이 향상 될 수 있다면 듣고 싶습니다.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)] 
public class EnforceHttpsAttribute : RequireHttpsAttribute 
{ 
    private static bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return httpContext.Request.IsSecureConnection; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!AuthorizeCore(filterContext.HttpContext)) 
     { 
      HandleNonHttpsRequest(filterContext); 
     } 
     else 
     { 
      var cache = filterContext.HttpContext.Response.Cache; 
      cache.SetProxyMaxAge(new TimeSpan(0L)); 
      cache.AddValidationCallback(CacheValidateHandler, null); 
     } 
    } 

    // ReSharper disable RedundantAssignment 
    private static void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) 
    // ReSharper restore RedundantAssignment 
    { 
     validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
    } 

    private static HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext) 
    { 
     return !httpContext.Request.IsSecureConnection 
      ? HttpValidationStatus.IgnoreThisRequest 
      : HttpValidationStatus.Valid; 
    } 
} 

응답 한

좋은 질문을 언급, 나는 확실하지 않다. HandleNonHttpsRequest는 기본 RequireHttpsAttribute에서 가져옵니다. 나는 단지 fiddler2에서 검사를 수행했으며, http를 통해 전송 된 요청은 단 하나뿐입니다. 그러나 응답은 https를 통해 되돌아 왔습니다.

출력 캐시에서 RequireHttps를 사용하기 위해 위의 코드를 사용함을 알았습니다. RequireHttps 속성을 사용하는 것이 나을 것입니다.

+0

'HandleNonHttpsRequest' 메쏘드는 당신이나 다른 논리를 위해 리다이렉트를 수행합니까? –

2

이런 식으로 뭔가 도움이 될 것입니다 :

이 가
관련 문제