Проблема аутентификации Blazor: внедренная служба имеет пустое состояниеC#

Место общения программистов C#
Ответить
Anonymous
 Проблема аутентификации Blazor: внедренная служба имеет пустое состояние

Сообщение Anonymous »

Я пишу свое первое серверное приложение Blazor (.NET 8) и борюсь с логикой аутентификации: при внедрении в службу информация о пользователе/аутентификации пуста.
У меня есть простой сервис для хранения информации о пользователе после входа в систему:

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

public class UserService
{
private string _username = string.Empty;
public string Username => _username;
public bool IsAuthenticated => !string.IsNullOrEmpty(_username);

public void SetUser(string username)
{
_username = username;
}

public void ClearUser()
{
_username = "";
}
}
При внедрении в службу имя пользователя всегда пусто:

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

public class TestService
{
private string Username { get; set; }

public TestService(UserService userService)
{
Username = userService.Username;  provider.GetRequiredService());

builder.Services.AddAuthorizationCore();

var app = builder.Build();
app.UseSession();

app.UseHttpsRedirection();

app.UseStaticFiles(); ;
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseAntiforgery();

app.MapControllers();
app.MapRazorPages();

app.MapRazorComponents().AddInteractiveServerRenderMode();

app.Run();
Когда пользователь входит в систему, имя пользователя правильно передается в NotifyUserAuthentication в CustomAuthenticationStateProvider (который вызывает _userService.SetUser) и в GetAuthenticationStateAsync.
Только в конструкторе службы имя пользователя пусто.
Я использую VS2022, и приложение позже также будет работать под IIS.
Чего мне не хватает?
Обновление от 15.10.2024:
Я загрузил минимальный воспроизводимый пример на Google Диск. Не стесняйтесь загрузить его, чтобы воспроизвести проблему:
Runnable MRE
Обновление от 16.10.2024: если я вместо этого использую IHttpContextAccessor в TestService, оно работает (по крайней мере, в Dev ):

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

public class TestService
{
public string Username { get; set; }

public TestService(IHttpContextAccessor httpContextAccessor)
{
Username = httpContextAccessor.HttpContext?.User?.Identity?.Name ?? "unknown";
}

//public TestService(UserService userService)
//{
//    Username = userService.Username;
//}
}
Однако при развертывании в IIS он по-прежнему не работает (информация пользователя через HttpContext имеет значение null).
Любые идеи о том, как получить это работает при размещении внутри IIS?

Подробнее здесь: https://stackoverflow.com/questions/790 ... mpty-state
Ответить

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

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

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

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

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