Ошибка аутентификации OIDC на общедоступном URL-адресе за обратным прокси-сервером IISC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка аутентификации OIDC на общедоступном URL-адресе за обратным прокси-сервером IIS

Сообщение Anonymous »

Я использую аутентификацию WSO2 Asgardeo для своего приложения, размещенного на Blazor WebAssembly.
Приложение размещено на внутреннем сервере:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»