2017-03-02 342 views
1

我使用ARR沒有https卸載我們的非本地託管環境。這意味着命中ARR的請求是https,但發送到後端服務器的請求只是httpHTTPS要求使用ARR

如果我在openiddict禁用https要求再配置返回http網址。如果我啓用它,那麼請求將被拒絕,後端服務器會以http的身份接收它們。有沒有辦法解決?

回答

1

你描述的其實是一個很常見的問題是影響任何ASP.NET的核心應用,做 - 或不 - 用OpenIddict和反向代理級別執行TLS終止時出現:在這種情況下,ASP.NET核心確實沒有辦法知道實際的方案是什麼,所以它假定HttpRequest.Schemehttp,而不是https

爲了解決這個問題,你必須還原真實的方案,使所有依賴於它的中間件 - 按照預期工作 - 包括OpenIddict。

這可以使用"forwarded headers" middleware通過參考Microsoft.AspNetCore.HttpOverrides包並調用app.UseForwardedHeaders()來完成。

根據你的代理,你可能需要調整設置以匹配其使用的標頭。

注意:使用IIS集成包時,會自動註冊此中間件。您可以使用此語法修改默認選項:

services.Configure<ForwardedHeadersOptions>(options => 
{ 
    options.ForwardedHeaders = ForwardedHeaders.XForwardedProto; 
}); 

如果這個方法行不通,你仍然可以使用內聯中間件覆蓋方案:

app.Use((context, next) => 
{ 
    context.Request.Scheme = "https"; 

    return next(); 
}); 

確保您的註冊它在任何其他中間件之前。

+2

因爲'ForwardedHeaderOptions.RequireSymmetry'默認爲true,所以默認選項不會在ARR後面工作,因爲'X-Forwarded-For'有2個入口但'X-Forwarded-Proto'有1個。所以設置'選項。 ForwardedHeaders = ForwardedHeaders.XForwardedProto'工作。謝謝。我用 app.UseForwardedHeaders(新ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedProto, }); – pholly