Проблемы с аутентификацией ASP.NET Core через Oracle Oauth, когда сайт находится за WAF/шлюзом.C#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с аутентификацией ASP.NET Core через Oracle Oauth, когда сайт находится за WAF/шлюзом.

Сообщение Anonymous »

У меня есть интерфейсное приложение (JavaScript), которое использует серверную часть C# .NET. Аутентификация реализована через OAuth (Oracle IDCS). Все работало нормально, но теперь серверное приложение находится за шлюзом API/WAF (доступным через Интернет). Допустим, публичный хост — public-host.com. Шлюз транслирует общедоступный адрес на локальный хост, на котором мое серверное приложение получает запросы (поэтому мой сервер «думает», что он размещен под другим URL-адресом, чем на самом деле). Допустим, частный хост — Private-host.io. Теперь серверная часть использует неверный параметр OAuth redirect_uri при вызове Oracle (https://idcs-xxx.identity.oraclecloud.c ... e/callback&... — пример без кодировки URL). Публично это https, но локально/внутренне это http.
Я попытался это исправить:
services
.AddAuthentication(options =>
{
/*...*/
})
.AddOAuth("Oracle", options =>
{
options.Events = new OAuthEvents
{
OnRedirectToAuthorizationEndpoint = context =>
{
// Replace the `redirect_uri` query string parameter found in `context.RedirectUri` with the public one
// so replace "http://internal-host.io/" with "https://public-host.com/" when redirecting to Oracles OAuth endpoint
// context.RedirectUri holds the full redirect URL like: https://idcs-xxx.identity.oraclecloud.c ... e/callback
// this is more of a pseudo-code because we have to deal with encoding the URL/query string
context.RedirectUri = context.RedirectUri.Replace("http://internal-host.io/", "https://public-host.com/");
context.Response.Redirect(context.RedirectUri);
return Task.CompletedTask;
}
};
});


Теперь при отправке запроса OAuth используется правильный параметр redirect_uri, аутентификация в Oracle проходит успешно (я думаю) и Oracle перенаправляет обратно на правильный адрес (https://public-host.com/authorization-c ... k?code=XXX но теперь код C# выдает две ошибки:
An error was encountered while handling the remote login. Correlation failed.
Microsoft.AspNetCore.Authentication.AuthenticationFailureException:
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1+d__12.MoveNext (Microsoft.AspNetCore.Authentication, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)

и
Microsoft.AspNetCore.Authentication.AuthenticationFailureException: An error was encountered while handling the remote login.
---> Microsoft.AspNetCore.Authentication.AuthenticationFailureException: OAuth token endpoint failure: invalid_redirect_uri;Description=Client XXXX requested an invalid redirect URL: http://internal-host.io:443/authorization-code/callback.

(обратите внимание на http://internal-host.io)
Поэтому я подозреваю, что, несмотря на то, что я изменил redirect_uri в OnRedirectToAuthorizationEndpoint код обработки OAuth каким-то образом ожидает local-host.io вместо public-host.com и терпит неудачу, потому что это что-то другое...
< hr />
Еще несколько настроек:
services.AddAuthentication(options => {...})
.AddOAuth("Oracle", options =>
{
Uri apiAddress = configuration.OracleApiAddress;
options.AuthorizationEndpoint = $"{apiAddress}/oauth2/v1/authorize";
options.Scope.Add("openid");
options.Scope.Add("urn:opc:idm:__myscopes__");
options.CallbackPath = new PathString("/authorization-code/callback");
options.ClientId = configuration.OracleApplicationId;
options.ClientSecret = configuration.OracleApplicationSecret;
options.TokenEndpoint = $"{apiAddress}/oauth2/v1/token";
options.UserInformationEndpoint = $"{apiAddress}/oauth2/v1/userinfo";
// ...
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... -waf-gatew
Ответить

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

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

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

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

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