#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 (службы идентификации)