2015-09-22 2 views
1

Я использую MVC4, ASP.NET 4.5, C#Как перехватить соединение без SSL в методе onAuthorization?

Я хочу, чтобы добавить код к моему методу onAuthorization в global.asa, чтобы определить соединение является ли SSL или нет, если нет, то выдать постоянный редирект на Домен SSL. Я использую другой домен, который является SSLed.

В моей Вход контроллера У меня есть код вдоль линий:

[HttpGet] 
public virtual ActionResult LogOn(string Error="") 
{ 
if (Request.IsSecureConnection) 
     { 
      return View(viewModel); 
     } 
     else 
     { 
      return RedirectPermanent("https://www.mysslapp.com/logon"); 
     } 
} 

Я хочу, чтобы добавить такую ​​же функциональность метода onAuthorization так, что, когда действия, подпадающие под действие [авторизовать] фильтр называют то они также должен быть доступен через SSL-соединение. Поэтому я считаю, что мой код global.asa нуждается в изменении. Однако он не принимает «Request.IsSecureConnection», поскольку контекст отличается.

Мой «псевдо» Global.asa onAuthorization рутина:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 

    if (Request.IsSecureConnection) 
    { 
     base.OnAuthorization(filterContext); 
    } 
    else 
    { 
     RedirectPermanent("https://www.mysslapp.com/logon"); 
    } 

} 

выше не будет работать, но он описывает то, что я пытаюсь достичь. Я был бы признателен за помощь в том, как мне нужно изменить вышеприведенный код, чтобы он работал, чтобы любое «приключенческое» использование URL-адресов на подключении без SSL автоматически перенаправлялось на страницу входа в сайт SSL.

Заранее спасибо.

EDIT1

думаю, что я первый бит:

filterContext.HttpContext.Request.IsSecureConnection 

EDIT2

if (filterContext.HttpContext.Request.IsSecureConnection) 
    { 
    base.OnAuthorization(filterContext); 
    } 
else 
    {  
    filterContext.Result = new RedirectResult("https://www.mysslapp.com"); 
    } 
+1

Ваш случай использования немного запутан. SSL - это не то же самое, что и IsAuthenticated. Обычно вы используете 'AuthorizeAttribute', чтобы определить, зарегистрирован ли пользователь (и в правильной роли), а если нет, отклоните запрос. Обычно, когда вы хотите перенаправить с «HTTP» на «HTTPS», вы используете тот же путь, который запросил пользователь. Затем, если пользователю необходимо войти в систему, 'AuthorizeAttribute' отклонит запрос, а MVC добавит' returnUrl' к строке запроса, поэтому, когда пользователь войдет в систему, они перейдут к адресу, который они запросили. Что именно вы пытаетесь достичь здесь? – NightOwl888

+0

Спасибо за ответ. Я решил использовать совершенно отдельный домен для SSL, поскольку я использую Cloudflare, для SSL и других функций безопасности. Кроме того, я хочу, чтобы старый домен non ssl продолжал маршрутизацию на страницы продаж не для приложений. Приложение, используемое для использования app.nonssl.com. Поэтому я хочу перенаправить на «mysslapp.com», если соединение не ssl, то есть, если они придут на мой сайт через «app.nonssl.com». Я не хочу делать это только на странице входа в систему, мне нужно предотвратить доступ к ssl без каких-либо действий, и мне показалось, что использование кода в методе onAuthorization может сделать трюк. – SamJolly

+0

С тех пор я добавил код, и он работает, как и EDIT2. Хотя я не уверен, как сделать постоянную переадресацию. – SamJolly

ответ

1

Я думаю, ваш главный вопрос заключается в том, что у вас есть 2 отдельные проблемы, и вы пытаетесь достичь и за один присест. Ваши 2 опасения:

  1. Создание каждого URL домена 301 перенаправления на тот же URL на домен B
  2. Создание домена B переадресовать все запросы к HTTPS

Первый действительно легко. Создайте новый сайт IIS для домена A, установите IIS rewrite module, добавьте этот web.config на сайт, а затем настройте свой DNS (если необходимо), чтобы сделать сайт живым.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpRedirect 
      enabled="true" 
      destination="https://www.mysslapp.com$V$Q" 
      exactDestination="true" 
      httpResponseStatus="Permanent" /> 
     <httpProtocol> 
      <redirectHeaders> 
       <!-- This is to ensure that clients don't cache the 301 itself - 
       this is dangerous because the 301 can't change when put in place 
       once it is cached --> 
       <add name="Cache-Control" value="no-cache"/> 
      </redirectHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

Примечание: Приведенная выше конфигурация для IIS 7.5. Я не уверен, что он будет работать в других версиях IIS.

Теперь ни один из пользователей домена B не подвергнется удару по производительности правила перенаправления, поэтому все это хорошо.

Для перенаправления ваших пользователей домена B на HTTPS вы не должны использовать 301. Почему? Потому что не все браузеры отвечают на 301.

Вы также не должны разрешать HTTPS на домене, но разрешать как HTTP, так и HTTPS. Зачем? Поскольку ваши пользователи, которые набирают myssldomain.com, получат уродливое сообщение об ошибке вместо быстрого перенаправления на ваш HTTPS-защищенный сайт.

Таким образом, простое решение для перенаправления всего вашего сайта на HTTPS - использовать атрибут RequireHttps и зарегистрировать его как глобальный фильтр. RequireHttpsAttribute использует перенаправление 302, когда приходит запрос, который не является безопасным.

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new RequireHttpsAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
} 

Что касается AuthorizeAttribute, вы должны оставить, что из уравнения в целом, если нет необходимости некоторых настроек, которая имеет дело с разрешением.

+0

Спасибо за этот очень полный ответ. Я должен был заявить, что я развертываю в Azure Web Apps, поэтому я думаю, что могу изменить IIS как таковой. Также интересно подобрать вашу рекомендацию не использовать 301 перенаправление, которое инстинктивно меня немного беспокоило. – SamJolly

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