2014-11-06 63 views
1

对于网站登录,我正在使用ServiceStack的身份验证功能以及Authenticate属性,CredentialsAuthProvider和UserAuth存储库。然而,在生产中,我们将所有IIS主机放在仅通过设计提供HTTPS服务的负载平衡器后面(将端口443上的所有请求转发到IIS实例上的端口80),这种方法运行良好。这就产生了一个问题 - Authenticate属性仅重定向到HTTP端口80上的登录页面(我认为是因为它只能看到代理请求Url,而不是原来的)。这会导致浏览器中的请求失败,因为负载平衡器不会执行HTTP并且不会将HTTP请求重定向到HTTPS。我们无法将IIS配置为仅限HTTPS。使用ServiceStack身份验证,有没有办法让重定向始终是HTTPS?

有没有办法使Auth提供程序中的重定向始终为HTTPS?或者,Auth提供程序可以查看X-Forwarded-Proto的HTTP标头以查看登录页面请求是否应该通过HTTPS?

回答

1

下面是从杰米斯贝洛特在ServiceStack客户论坛回复:

一些OAuth的网址在配置中指定: https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization#oauth-configuration

对于其他自动生成的URL可以将其设置为使用https:

SetConfig(new HostConfig { 
    UseHttpsLinks = true 
}); 

哪个应该修改最新的v4.0.33版本中使用的BaseUrl。

您还可以覆盖AppHost. ResolveAbsoluteUrl方法到 introspect/customize 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; 
} 

(负载平衡器和实例都在AWS的方式)

相关问题