Цикл перенаправления с фильтром действия SSL в ASP.NET MVC - PullRequest
3 голосов
/ 24 февраля 2010

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

Это прекрасно работает локально (используя фиктивный сертификат в 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:

Страница не перенаправляет должным образом

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

Эта проблема иногда может быть вызвана отключив или отказавшись принять печенье.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Попробуйте перенаправить более 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);
}
1 голос
/ 09 декабря 2010

У меня была такая же проблема на создаваемом мной сайте, и я обнаружил, что по какой-то причине это связано с наличием номера порта в 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 голосов
/ 30 мая 2011

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

...