2014-11-06 2 views
1

Для входа в сайт я использую функцию аутентификации ServiceStack с атрибутом Authenticate, CredentialsAuthProvider и репозитаром UserAuth. Он отлично работает, однако в производстве мы помещаем все хосты IIS за балансировщик, который поддерживает только HTTPS по дизайну (перенаправление всех запросов на порт 443 на порт 80 в экземплярах IIS). Это создает проблему - атрибут Authenticate перенаправляется на страницу входа только на порт HTTP 80 (я думаю, потому что он видит только прокси-запрос Url, а не оригинал). Это приводит к неудачному запросу в браузере, потому что балансировщик нагрузки не выполняет HTTP и не перенаправляет HTTP-запросы на HTTPS. Мы не можем настроить IIS также как HTTPS.С ServiceStack Auth, есть ли способ сделать переадресацию всегда HTTPS?

Есть ли способ сделать переадресацию в провайдере Auth всегда HTTPS? Или, может ли поставщик Auth посмотреть заголовки HTTP для X-Forwarded-Proto, чтобы увидеть, что запрос страницы входа в систему должен превышать HTTPS?

ответ

1

Вот ответ от Demis Bellot на Форумах ServiceStack Заказчик:

Некоторые из OAuth адресов указаны в конфигурации: https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization#oauth-configuration

Для других автоматически сгенерированных URLS вы можете установить его использовать https:

SetConfig(new HostConfig { 
    UseHttpsLinks = true 
}); 

Какой должен изменить BaseUrl, используемый в последней версии версии 4.0.

Вы также можете переопределить метод AppHost. ResolveAbsoluteUrl на introspect/настроить URL.

И моя реализация AppHost.ResolveAbsoluteUrl переопределения

public override string ResolveAbsoluteUrl(string virtualPath, IRequest httpReq) 
{ 
    virtualPath = virtualPath.SanitizedVirtualPath(); 
    var absoluteUrl = httpReq.GetAbsoluteUrl(virtualPath); 

    return httpReq.Headers["X-Forwarded-Proto"] != null 
     && httpReq.Headers["X-Forwarded-Proto"].Equals("https", StringComparison.InvariantCultureIgnoreCase) 
     ? absoluteUrl.Replace("http://", "https://") : absoluteUrl; 
} 

(The loadbalancer и экземпляры на AWS, кстати)

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