с сервером Blazor (. Net Core 3), это сработало для меня:
public class AuthTest
{
private readonly AuthenticationStateProvider _authenticationStateProvider;
public AuthTest(AuthenticationStateProvider authenticationStateProvider)
{
_authenticationStateProvider = authenticationStateProvider;
}
public async Task<IIdentity> GetIdentity()
{
var authState = await _authenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
return user.Identity;
}
}
Вам необходимо зарегистрировать это с ASP. Net Core DI в Startup.ConfigureServices
:
services.AddScoped<AuthTest>();
А затем внедрите его на свою страницу .razor
:
@page "/AuthTest"
@inject AuthTest authTest;
<button @onclick="@LogUsername">Write user info to console</button>
@code{
private async Task LogUsername()
{
var identity= await authTest.IsAuthenticated();
Console.WriteLine(identity.Name);
}
Вы должны увидеть имя пользователя, вошедшего в систему, записанное в выходную консоль ASP. Net.
Обновление Если вы хотите получить пользователя, вошедшего в систему в данный момент, из отдельного класса, и вы не внедряете это на страницу блейзора, тогда, похоже, вам просто нужно внедрить IHttpContextAccessor в этот класс (как видно здесь )
Так, например, если вы хотите иметь обычный API или контроллер MVC в приложении Blazor, вы должны сделать это.
например
public class UserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void GetUsername()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
return username;
}
}
и убедитесь, что вы зарегистрировали его в ConfigureServices:
services.AddHttpContextAccessor();