2013-07-11 2 views
1

Я искал решение этой проблемы более 10 часов без ответа. В моем приложении я использую атрибут [requirehttps]. Когда вы нажимаете на метод действия, украшенный этим атрибутом, я получаю «не могу отобразить веб-страницу» в IE. После того, как я перебрался в эту проблему, я увидел, что я получал бесконечные 302 звонка в Fiddler, что в конечном итоге приведет к таймауту и ​​вызовет эту ошибку. создать пользовательский атрибут и физически создать https-вызов.Я использую IIS Express и успешно создал сертификат и привязал порт.Если я вызываю этот URL-адрес непосредственно через браузер, все работает нормально.Это код, который я использовал для перенаправления запрос.MVC3 Redirect Loop

public class HttpsAttribute : System.Web.Mvc.RequireHttpsAttribute 
{ 
public bool RequireSecure = false; 

public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext){ 
    var builder = new UriBuilder(HttpContext.Current.Request.Url); 

    if (RequireSecure){ 
    // redirect to HTTP version of page   
    builder.Scheme = Uri.UriSchemeHttps; 
    builder.Port = 44300; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
    }  
    else{   
    // non secure requested   
    if (filterContext.HttpContext.Request.IsSecureConnection){    
     HandleNonHttpRequest(filterContext);   
    }  
    }  
}  

protected virtual void HandleNonHttpRequest(AuthorizationContext filterContext){  
    if (String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)){   
    // redirect to HTTP version of page   
    string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;   
    filterContext.Result = new RedirectResult(url);  
    } 
} 
} 

Когда я поставил точку останова, чтобы выяснить, какое значение строителя, это правильно. И именно отсюда я получаю бесконечный цикл перенаправления. странно то, что первый запрос никогда не правильно когда я просматриваю URL-адрес в браузере. Как будто UriBuilder не отправляет правильный URL. Есть идеи? Это сводит меня с ума.

+0

Что вы имеете в виду бесконечный цикл перенаправления? – ataravati

ответ

4

Цикл переадресации происходит потому, что код проверяет только, требуется ли перенаправление HTTPS, а не если текущий запрос уже является HTTPS (т. Е. Перенаправление уже произошло).

if (RequireSecure && !filterContext.HttpContext.Request.IsSecureConnection){ 
    // redirect to HTTP version of page   
    builder.Scheme = Uri.UriSchemeHttps; 
    builder.Port = 44300; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
}  
else{   
    // non secure requested   
    if (filterContext.HttpContext.Request.IsSecureConnection){    
    HandleNonHttpRequest(filterContext);   
    }  
} 

Хотя RequireHttps должен работать правильно для этого, если вам не нужно перенаправить на указанный порт.

EDIT: Refactored атрибут

public class HttpsAttribute : System.Web.Mvc.RequireHttpsAttribute 
{ 
    public bool RequireSecure = false; 

    public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
    { 
     var requestUri = HttpContext.Current.Request.Url; 
     var requestIsSecure = HttpContext.Current.Request.IsSecureConnection; 

     if (RequireSecure && !requestIsSecure) 
      filterContext.Result = Redirect(requestUri, Uri.UriSchemeHttps, 44300); 
     else if (!RequireSecure && requestIsSecure) 
      filterContext.Result = Redirect(requestUri, Uri.UriSchemeHttp, 80); 

    } 

    private RedirectResult Redirect(Uri uri, string scheme, int port) 
    { 
     return new RedirectResult(new UriBuilder(uri) { Scheme = scheme, Port = port }.Uri.ToString()); 
    } 
} 
+0

Brent благодарит за ответ. Прежде чем я создал этот пользовательский атрибут, я использовал RequiredHttps и все еще получал цикл перенаправления. Когда IE сообщает мне, что «существует проблема с сертификатом безопасности этого веб-сайта», и я нажимаю «Продолжить», URL-адрес в браузере по-прежнему остается http. После нажатия продолжения начинается бесконечный цикл перенаправления. Я добавил дополнительную проверку состояния, которую вы упомянули, она исправляет цикл перенаправления, но теперь возвращает http вместо https. – Aaron

+0

@ Аарон Я смог воссоздать проблему, мой первоначальный ответ потребовал немного больше рефакторинга, я отредактировал ответ. –

+0

Спасибо, что работал. Действительно ценю это. Все еще не знаю, почему RequiredHttps отправил меня по этому пути. Мне нужно будет повернуть назад и узнать, что с ним происходит. – Aaron