2010-02-24 1 views
3

Я использую ActionFilter (см. Ниже), чтобы определить, требуется ли 1. текущий контроллер/действие требует SSL и 2. В настоящее время используется SSL и соответственно перенаправляется.Цикл переадресации с фильтром действий SSL в ASP.NET MVC

Это работает нормально локально (используя фиктивный сертификат в IIS 7), но как только я получаю его на сервере, я получаю сообщение об ошибке, указывающее на бесконечный цикл перенаправления.

Любые идеи?

public class SslFilter : ActionFilterAttribute 
{ 
    public SslFilter(bool sslRequired) 
    { 
     SslRequired = sslRequired; 
    } 

    public bool SslRequired { get; set; } 


    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase req = filterContext.HttpContext.Request; 
     HttpResponseBase res = filterContext.HttpContext.Response; 

     var builder = new UriBuilder(req.Url); 

     if (SslRequired && !req.IsSecureConnection) 
     { 
      builder.Scheme = Uri.UriSchemeHttps; 
      builder.Port = 443; 
      res.Redirect(builder.Uri.ToString()); 

     } 
     else if (!SslRequired && req.IsSecureConnection) 
     { 
      builder.Scheme = Uri.UriSchemeHttp; 
      builder.Port = 80; 
      res.Redirect(builder.Uri.ToString()); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Firefox ошибка:

The page isn't redirecting properly

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

This problem can sometimes be caused by disabling or refusing to accept cookies.

ответ

2

Try перенаправлении более MVCish образом:

var builder = new UriBuilder(req.Url); 

if (SslRequired && !req.IsSecureConnection) 
{ 
    builder.Scheme = Uri.UriSchemeHttps; 
    builder.Port = 443; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
    filterContext.Cancel = true; 
} 
else if (!SslRequired && req.IsSecureConnection) 
{ 
    builder.Scheme = Uri.UriSchemeHttp; 
    builder.Port = 80; 
    filterContext.Result = new RedirectResult(builder.Uri.ToString()); 
    filterContext.Cancel = true; 
} 
else 
{ 
    base.OnActionExecuting(filterContext); 
} 
+0

Мы пробовали этот подход и оригинальный подход Alex H - в обоих случаях они работали в наших средах разработчиков, но не в производстве. Однако принятый подход в этом вопросе действительно работал - http://stackoverflow.com/questions/2302081/how-do-i-set-the-protocoll-when-using-redirecttoaction –

1

У меня была такая же проблема на сайте, что я в здании и обнаружили, что для некоторых причина в том, что он имел номер порта в URL-адресе. Итак, builder.Uri.ToString() выводил http://domain.com:80/ или https://domain.com:443/, что, насколько мне известно, должно быть прекрасным, но мы переключились на использование builder.Uri.AbsoluteUri, и он исправил проблему. Вот пример нашего кода ...

UriBuilder __urlBuilder = new UriBuilder(__context.Request.Url); 
if (!HttpContext.Current.Request.Url.Scheme.Contains("https")) { 
    if (this.Required == RequiredStates.Required) { 
    __urlBuilder.Scheme = "https"; 
    __urlBuilder.Port = 443; 
    HttpContext.Current.Response.Redirect(__urlBuilder.Uri.AbsoluteUri, true); 
    } 
} 
else { 
    if (this.Required == RequiredStates.NotRequired) { 
    __urlBuilder.Scheme = "http"; 
    __urlBuilder.Port = 80; 
    HttpContext.Current.Response.Redirect(__urlBuilder.Uri.AbsoluteUri, true); 
    } 
} 
0

Проверьте сертификат, установленный на сервере. Используйте средство настройки SSL из MS, чтобы обнаружить проблему. Скорее всего, частный отсутствует.

 Смежные вопросы

  • Нет связанных вопросов^_^