URL переписать HTTP на HTTPS, но теперь в обратном направлении - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть следующий код UrlRewrite, который нужно изменить с http на https в URL, но теперь мне нужно изменить его с https на http

Например, когда я перенаправляю обратно со страницы учетной записи / входа на домашнюю страницу.

Вот мои правила переписывания:

<rewrite>
   <rules>
      <rule name="RequiresHTTPS-Redirect" stopProcessing="true">
        <match url="(.+)" />
        <conditions>
          <add input="{HTTPS}" pattern="off" />
          <add input="{RequiresHTTPS:{R:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{C:1}"
                appendQueryString="true" redirectType="Found" />
      </rule>
   </rules>
   <rewriteMaps>
       <rewriteMap name="RequiresHTTPS">
           <add key="Account/LogOn" value="Account/LogOn" />
       </rewriteMap>
   </rewriteMaps>
</rewrite>

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Поставьте логику для перенаправления обратно на страницу, отличную от https, на самой странице входа. Проблема с перенаправлением с https на http заключается в том, что браузер все еще собирается инициировать ssl-соединение сначала с URL-адресом https, прежде чем сможет получить перенаправление, поэтому это несколько бессмысленно.

1 голос
/ 02 апреля 2011

Здесь есть пара сценариев:

1. Весь контент защищен веб-формами <authorization>:

Ваши пользователи заходят на страницу входа, потому что они перешли на часть сайта, защищенную с помощью элемента <authorization>. В этом случае вам будет передан обратный URL в строке запроса: ReturnUrl. Вы можете перенаправить пользователей обратно, откуда они пришли без SSL, используя:

return Redirect("http://" + Request.Url.Host + returnUrl);

2. Пользователи должны войти в систему, чтобы включить дополнительные функции:

Ваши пользователи нажимают на ссылку входа в систему, чтобы включить некоторые дополнительные функции, которые отключаются на ваших страницах, если они не вошли в систему. Например, возможность публиковать сообщения на форуме или просматривать премиум-контент.

В этом случае вы можете отслеживать, где они были до посадки на страницу входа. Этот пример основан на шаблонном приложении, которое вы получаете вместе с Visual Studio 2010 при создании нового приложения MVC3 (которое вы, возможно, использовали в качестве шаблона для своего проекта).

В этом примере приложения каждая страница использует главную страницу Site.Master. Site.Master делает Html.RenderPartial("LogOnUserControl"), чтобы отобразить ссылку для входа на каждой странице. Откройте LogOnUserControl.ascx и измените код для входа в систему ActionLink на:

else
{
    if(!Request.RawUrl.Contains("/Account/LogOn"))
    {
        Session["WhereWasI"] = Request.Url.AbsoluteUri;
    }
%> 
    [ <%: Html.ActionLink("Log On", "LogOn", "Account") %> ]
<%
}

Что мы в основном делаем для отслеживания страницы, на которой находится пользователь, если он не вошел в систему. Поскольку ссылка «Вход в систему» ​​также отображается на самой странице входа в систему, мы должны исключить это, поэтому оператор if:

if(!Request.RawUrl.Contains("/Account/LogOn"))

Затем в вашем методе обратной передачи AccountController.cs Logon вы можете вернуть пользователя туда, где он находился на сайте, но используя http вместо https::

Я также включил перенаправление на не-SSL, если при аутентификации с помощью ASP.NET Forms returnUrl:

public ActionResult LogOn(LogOnModel model, string returnUrl)
{
  if (ModelState.IsValid)
  {
    if (MembershipService.ValidateUser(model.UserName, model.Password))
    {
      FormsService.SignIn(model.UserName, model.RememberMe);
      if (Url.IsLocalUrl(returnUrl))
      {
        //
        // 1. All content is protected by web forms `<authorization>`:
        // If there was a return URL then go back there
        //
        if(!String.IsNullOrWhiteSpace(returnUrl))
        {
          return Redirect("http://" + Request.Url.Host + returnUrl);
        }
      }
      else
      {
        //
        // 2. Users have to logon to enable additional features:
        // 
        if (Session["WhereWasI"] != null)
        {
          return Redirect(
             Session["WhereWasI"].ToString().Replace("https", "http"));
        }

        return RedirectToAction("Index", "Home");
      }
    }
    else
    {
      ModelState.AddModelError("", 
            "The user name or password provided is incorrect.");
    }
  }

  // If we got this far, something failed, redisplay form
  return View(model);
}

Пример, возможно, немного упрощен, но вы должны понять общую идею.

...