Объект User.Claims пуст, когда приложение NET 6 развертывается в Linux, и возвращает ошибку 401 после входа пользователяLinux

Ответить
Anonymous
 Объект User.Claims пуст, когда приложение NET 6 развертывается в Linux, и возвращает ошибку 401 после входа пользователя

Сообщение Anonymous »

У меня есть приложение NET 6 с интерфейсом Angular. Он работает в производственной среде с серверами Windows и IIS. Однако мне пришлось перенести его в облако Linux из-за затрат и по другим причинам.
Я создал мини-кластер в своей домашней лаборатории, где развернул 2 сервера Ubuntu 22.04 для Интернета ( с использованием NGINX) и балансировку нагрузки/отказоустойчивость, а также один для сервера SQL. В эмулируемой среде код запускается, и приложение работает нормально.
Я использую облачный сервис Kamatera (опять же из-за затрат), где у меня есть 4 виртуальные машины с Ubuntu 22.04, 2 для web, 1 для SQL и 1 для HaProxy.
После развертывания приложения система переходит к экрану входа в систему, пользователь вводит учетные данные, и по какой-то причине я получаю ошибку 401. в консоли браузера.
В приведенном ниже фрагменте кода находится проблема.

Код: Выделить всё

            try
{
bl.UserID = User.Claims.FirstOrDefault(x => x.Type == System.Security.Claims.ClaimTypes.NameIdentifier).Value;

//other code here....

}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return StatusCode(500, ex.Message);
}
Приведенный выше код — это когда запрос выполняется на бэкэнде, поэтому после некоторого копания я увидел, что, возможно, существует проблема с перехватчиком authguard? (код Angular ниже)

Код: Выделить всё

  private processRequestWithToken(token: string, req: HttpRequest, next: HttpHandler) {
if (!!token && this.isSameOriginUrl(req)) {
req = req.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
}

return next.handle(req).pipe(
tap(() => {
},
error => {
if (error instanceof HttpErrorResponse) {
if (error.status !== 401) {
return;
}

setTimeout(() =>
notify('Unauthorized or user logged out. Please login again.', 'warning', 4000),
3000);

this.router.navigate(['/authentication/login']);
}
})
);
}

private isSameOriginUrl(req: any) {
// It's an absolute url with the same origin.
if (req.url.startsWith(`${window.location.origin}/`)) {
return true;
}

// It's a protocol relative url with the same origin.
// For example: //www.example.com/api/Products
if (req.url.startsWith(`//${window.location.host}/`)) {
return true;
}

// It's a relative url like /api/Products
if (/^\/[^\/].*/.test(req.url)) {
return true;
}

// It's an absolute or protocol relative url that
// doesn't have the same origin.
return false;
}
что бы я ни делал, я всегда получаю ошибку 401. Подскажите, пожалуйста, что мне следует проверить? Я предоставлю столько информации, сколько потребуется.
Приложение (без изменений в коде) отлично работает в Windows с IIS и в локальной домашней лаборатории Linux. Виртуальные машины Kamatera Cloud оснащены Ubuntu Linux 22.04 и всеми доступными обновлениями.
Заранее спасибо
Я пытался принудительно пройти проверку перехватчика пробовал разные методы настройки IndetityServer в файле Startup.cs, даже сохраняя ключ в DbContext, но безуспешно. Я ожидал, что пользователь пройдет аутентификацию, но безуспешно

Подробнее здесь: https://stackoverflow.com/questions/787 ... returns-er
Ответить

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

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

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

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

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