Серверное приложение Blazor. Проверка подлинности Windows в классе?

#c# #blazor

#c# #blazor

Вопрос:

Я использую последнюю версию VS2019Pro с ядром 3.1.

Похоже, что в Blazor ServerApp код в реальном времени выполняется в тегах @code{} на страницах .razor. Поэтому вместо использования API для предоставления данных я подумал, что было бы разумно просто создавать классы и методы для возврата данных.

Единственная проблема, с которой я сталкиваюсь, — это возможность использовать User.Идентификация.Имя в классе. Обычно это предоставляется на страницах .razor и в контроллерах без проблем, но как я могу (если это вообще возможно) использовать одного и того же пользователя.Идентификация.Имя свойства внутри классов?

Ответ №1:

Вы можете использовать стандартную аутентификацию .net core: https://learn.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-3.1

В основном вы определяете:

 [CascadingParameter] private Task<AuthenticationState> authenticationStateTask { get; set; }
  

Затем вы можете дождаться этого:

 private async Task LogUsername()
    {
        var authState = await authenticationStateTask;
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            _authMessage = $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            _authMessage = "The user is NOT authenticated.";
        }
    }
  

Редактировать ——

Что-то вроде этого??

Базовый компонент:

 [CascadingParameter] private Task<AuthenticationState> authenticationStateTask { get; set; }

public String Username {get;set;}

protected override async Task OnInitializedAsync(){
    Username = (await authenticationStateTask).User.Identity.Name;
}
  

Затем в других ваших компонентах:

 @inherits BaseCompomnent

@Username
  

Комментарии:

1. Привет, Милни, я получаю ошибку «нет объекта, установленного для ссылки на переменную authState». Весь этот код находится в классе, верно?

2. @Izacch — Извините, я немного пропустил, вам также нужно украсить задачу атрибутом [CascadingParameter] . Это потому, что оно передается компонентом более высокого уровня. Теперь смотрите отредактированный код

3. Эй, я все еще получаю то же самое исключение. Я неправильно думаю, что могу использовать приведенный выше пример кода в файле .cs? Я вызываю метод со страницы razor

4. Ах, нет, вам нужно иметь задачу в вашем файле Blazor — затем вы передадите имя пользователя в другой файл .cs при его вызове. Это то, как вы должны это делать в любом случае , чтобы вы могли легко протестировать другой свой компонент

5. @Izacch обновите свой вопрос тем, что вы пробовали? Посмотрите на мое редактирование — что-то вроде этого?

Ответ №2:

  IMyRoleManager _myRoleManager;
    private AuthenticationStateProvider _authenticationStateProvider;
    public MyRepository(IMyRoleManager myRoleManager, AuthenticationStateProvider authentication)
    {
        _myRoleManager = myRoleManager;
        _authenticationStateProvider = authentication;
    }

 public async Task<bool> AddRoleToUser(string role)
    {
        var id = await GetUserIdFromAuthenticationStateProviderAsync();
        var result = await _myRoleManager.SetRoleForUser(role, id);
        return resu<
    }
  

И в файле запуска должны быть правильные записи для services.xxx (службы идентификации)