Приложение размещено на внутреннем сервере:
https://test.myapp.local
Я настроил обратный прокси-сервер на другом сервере IIS, доступном в Интернет:
https://test.myapp.com
Когда я обращаюсь к приложению напрямую через внутренний сервер (test.myapp.local), аутентификация работает правильно.
Для справки: я уже настроил URL-адреса перенаправления для обоих доменов (.local и .com) в WSO2 Asgardeo.
Однако при доступе к приложению через обратный прокси-сервер (test.myapp.com) аутентификация не работает.
Не могли бы вы помочь определить, что может быть причиной этой проблемы?
Program.cs
Код: Выделить всё
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Mvc;
using Radzen;
using System.Net.Http.Headers;
namespace myapp
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents()
.AddAuthenticationStateSerialization(options => options.SerializeAllClaims = true)
.AddInteractiveWebAssemblyComponents();
builder.Services.AddRadzenComponents();
var asgardeo = builder.Configuration.GetSection("Authentication:Asgardeo");
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.Cookie.Name = ".Blazor.Asgardeo.Auth";
options.SlidingExpiration = true;
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
})
.AddOpenIdConnect(options =>
{
options.Authority = asgardeo["Authority"];
options.ClientId = asgardeo["ClientId"];
options.ClientSecret = asgardeo["ClientSecret"];
options.ResponseType = "code";
options.UsePkce = true;
options.SignedOutCallbackPath = asgardeo["SignedOutCallbackPath"];
options.RemoteSignOutPath = asgardeo["RemoteSignedOutCallbackPath"];
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Clear();
foreach (var scope in asgardeo.GetSection("Scopes").Get())
{
options.Scope.Add(scope);
}
});
builder.Services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN";
});
builder.Services.AddResponseCaching();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
options.AddPolicy("AdminOnly", policy =>
policy.RequireRole("dealerportal.admin"));
});
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddHttpClient();
builder.Services.AddScoped();
var app = builder.Build();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedProto |
ForwardedHeaders.XForwardedHost
});
if (app.Environment.IsDevelopment())
{
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.UseResponseCaching();
app.MapGet("/login", async (HttpContext context) =>
{
await context.ChallengeAsync(
OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties { RedirectUri = "/" });
});
app.MapGet("/logout", async (HttpContext context) =>
{
await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await context.SignOutAsync(
OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties { RedirectUri = "/" });
});
app.MapPost("/forcefully-logout", async (HttpContext context) =>
{
await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
context.Response.StatusCode = StatusCodes.Status200OK;
});
app.MapControllers();
app.MapStaticAssets();
app.MapRazorComponents()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(Client._Imports).Assembly);
app.Run();
}
}
}
При внутреннем доступе к приложению оно правильно перенаправляется на URL-адрес входа в Asgardeo:
https://accounts.asgardeo.io/t/myappcom ... Kx243FCccg
Однако, при доступе к рабочему сайту через обратный прокси-сервер он перенаправляется на:
https://test.myapp.com/t/myappcompany/a ... Kx243FCccg
Подробнее здесь: https://stackoverflow.com/questions/798 ... -proxy-iis
Мобильная версия