我在 Linux VM 的開源
Caprover 使用 Docker 容器和 Nginx 代理服務器,所以我懷疑這是Request.IsHttps在我的 Windows 筆記本電腦上運行應用程式時回傳 true 的問題。
這是 program.cs,它只是一個典型的 Visual Studio 模板。
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
問題是如何配置應用程式以檢測它在 Https 中運行?
uj5u.com熱心網友回復:
正如懷疑的那樣,問題是 Nginx 代理服務器處理 https 連接的加密/解密,但是在將請求轉發到容器時,它使用純 http。所以 asp.net 永遠不會看到 https 連接,因為它在代理服務器處終止。解決方案是轉發X-Forwarded-For和X-Forwarded-Proto標題。請參閱下面的修改。
程式.cs
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
//ADD: Configure middleware to add X-Forwarded-For and X-Forwarded-Proto headers
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
//accept all networks and proxies
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
var app = builder.Build();
//ADD: use ForwardedHeaders middleware
app.UseForwardedHeaders();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
//REMOVE: not needed as nginx proxy server handling https
//app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
這是Github 上的完整示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431765.html
上一篇:Serilog如何檢索關鍵資訊?
下一篇:基于用戶權限的動態選單生成
