这是一个相当奇怪的问题,但最近我进行了一些研究,发现以下情况。似乎Azure网站不喜欢从
OAuth2Provider
的
Authenticate
方法返回的
HttpResult
。
请注意:此问题仅在托管于Azure网站时存在。当托管在其他地方时,ServiceStack OAuth2Providers(4.0.24到4.0.40)按预期工作。
具体而言,当返回HttpResult
时,它不喜欢设置Content-Length
标头。我不确定为什么会出现这种情况,因为在本地和部署到我自己在AWS上的IIS主机时都可以正常工作。
我创建了一个存储库,您可以部署它以突出显示此问题。
Azure网站似乎与标准IIS设置(例如,在干净的VM上通过Web Installer安装)对此响应进行了不同的解释,这似乎是问题的原因。
一个(不是很好的)解决方法是使用一个 GlobalResponseFilter 去掉只有 GoogleOAuth2Provider 响应中的 Content-Length 头。
我已经测试过了,确实按预期工作,我能够使用 Google OAuth 登录。这里有一个使用 GlobalResponseFilter 解决此问题的示例。
GlobalResponseFilters.Add((req, res, dto) =>
{
if (!req.PathInfo.EndsWith("/auth/GoogleOAuth", true, CultureInfo.InvariantCulture))
{
return;
}
HttpResult httpResult = dto as HttpResult;
if (httpResult != null && httpResult.Headers.ContainsKey("Content-Length"))
{
httpResult.Headers.Remove("Content-Length");
}
});
希望有人能指出Azure网站这样做的原因。希望这可以帮到你。