2015-03-11 3 views
3

Я пытаюсь включить HTTPS всюду в моем приложении MVC. В моих FilterConfig.cs я добавил следующую строку:ASP.NET MVC RequireHttps Атрибут не работает

filters.Add(new RequireHttpsAttribute());

Однако при переходе на сайт, вся функциональность доступна через HTTP и HTTPS может использоваться только тогда, когда пользователь явно указывает это в их адресную строку браузера.

Когда эта строка кода присутствует в моей локальном версии приложения, она перестает работать, и я больше не могу использовать HTTP (как и следовало ожидать).

Я размещаю заявку на Azure. Я что-то упускаю?

+0

Вы выполнили инструкции по включению SSL в проект, указанный здесь? http://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-deploy-aspnet-mvc-app-membership-oauth-sql-database/#enable-ssl-for-the-project – rogerdeuce

+0

Да, это означает, что только разрешить SSL локально. SSL оказывается включенным в Azure независимо от этого параметра, но не принудительно, что является поведением, которое я пытаюсь достичь. –

+0

Вы можете добавить правило перенаправления URL для перенаправления с 'http: // *' на 'https: // *'. Это буквально одно и то же. См. Http://stackoverflow.com/questions/1536120/rewriting-urls-from-https-to-http-in-iis7 или аналогичный. – abatishchev

ответ

1

Вы можете выполнить это, используя модуль URLRewrite. (Download is here)

Тогда вы можете просто перенаправить все запросы на порт 80 в https, используя правило в вашем web.config.

<rewrite> 
<rule name="Redirect to HTTPS" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{HTTPS}" pattern="^OFF$" /> 
    </conditions> 
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" /> 
</rule> 
</rewrite> 

Обратите внимание, что вы можете изменить redirectType на постоянное место, если у вас есть поисковых ботов, ползающих ваш сайт, и вы пытаетесь сохранить ваш SEO.

Вы можете добавить это правило в свою конфигурацию Release, чтобы оно было применено только при развертывании в Azure. Таким образом, вы можете запускать локально на порту 80, пока вы делаете свое развитие.

+0

Кажется, что это, наверное, лучший ответ, который я собираюсь получить, хотя это не идеально! Я бы скорее понял, почему атрибут не работает. –

+0

Лучше всего я могу предложить начать с пустого проекта MVC, добавить атрибут и посмотреть, работает ли он. Если да, попробуйте выяснить, в чем разница. – mgnoonan

+0

Да, я дам этот выстрел и отчитаюсь. Приветствия. :) –

0

Убедитесь, что у вас есть конечная точка и привязка http (в дополнение к конечной точке и привязке https) в вашем csdef. В частности:

<InputEndpoint name="HttpEndpoint" protocol="http" port="80" /> 

и

<Binding name="HttpEndpoint" endpointName="HttpEndpoint" /> 
1

Я использую AllowAnonymous и атрибут OverrideAuthorization на некоторых из моих контроллеров и, казалось, что это отменяет RequireHttpsAttribute, который я зарегистрирован с моим GlobalFilterCollection.