Я внедряю пользовательскую аутентификацию StateProvider и использую информацию из претензий пользователей в Mainlayout. Насколько я понял после выполнения метода notifyAuthenticationStateChanged , должен сам редерендировать все компоненты, которые используют e.t.c. Но это не так. Более того, я внедрил свой собственный перезарядчик для Mainlayout и перезагрузил его, используя StateHaschanged после входа пользователя. Но по какой -то причине все еще считает, что никого разрешено и не видно блоку кода в Блок. Но если я перезагружаю страницу вручную getauthenticationStateAsync метод выполняется, и после того, как этот блок кода внутри отображается. Я делаю не так или иначе или это ошибка?
My CustomAuthenticationStateProvider < /code> код: < /p>
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly ISessionStorageService _sessionStorage;
public CustomAuthenticationStateProvider(ISessionStorageService sessionStorage)
{
_sessionStorage = sessionStorage;
}
public override async Task GetAuthenticationStateAsync()
{
var userModel = await _sessionStorage.GetItemAsync("userModel");
var identity = new ClaimsIdentity();
if (userModel != null)
{
identity = new ClaimsIdentity( new []
{
//Some my claims
...
}, "api");
}
else
{
identity = new ClaimsIdentity();
}
var claimsPrincipal = new ClaimsPrincipal(identity);
return new AuthenticationState(claimsPrincipal);
}
public void AuthenticateUser(AuthorizedModel model)
{
var identity = new ClaimsIdentity(new []
{
//Some my claims
...
});
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}
public async Task LogUserOut()
{
await _sessionStorage.RemoveItemAsync("nickName");
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}
}
< /code>
my login: < /p>
public async Task HandleValidSubmit()
{
var authorizedUser = await loginRepository.TryLogin(_model);
...
((CustomAuthenticationStateProvider)authenticationStateProvider).AuthenticateUser(authorizedUser);
await sessionStorage.SetItemAsync("userModel", authorizedUser);
navigationManager.NavigateTo("/");
//This is for my custom page reload
authorizationState.LoggedIn = true;
}
< /code>
my mainlayout: < /p>
@inherits LayoutComponentBase
...
//Some block of code for non-authorized
...
...
< /code>
и, наконец, пользовательский код: < /p>
@using System.Security.Claims
...
@userFirstName
@userSecondName
@userNickName
Online
@code{
[CascadingParameter]
private Task authenticationStateTask { get; set; }
ClaimsPrincipal user;
string userFirstName;
...
protected override async Task OnInitializedAsync()
{
user = (await authenticationStateTask).User;
//Here I just get userInfo from claims
...
}
}
Подробнее здесь: https://stackoverflow.com/questions/617 ... d-elements
BlazornotifyAuthenticationStateChanged не обновляет авторизованные элементы ⇐ C#
Место общения программистов C#
1738912132
Anonymous
Я внедряю пользовательскую аутентификацию StateProvider и использую информацию из претензий пользователей в Mainlayout. Насколько я понял после выполнения метода notifyAuthenticationStateChanged , должен сам редерендировать все компоненты, которые используют e.t.c. Но это не так. Более того, я внедрил свой собственный перезарядчик для Mainlayout и перезагрузил его, используя StateHaschanged после входа пользователя. Но по какой -то причине все еще считает, что никого разрешено и не видно блоку кода в Блок. Но если я перезагружаю страницу вручную getauthenticationStateAsync метод выполняется, и после того, как этот блок кода внутри отображается. Я делаю не так или иначе или это ошибка?
My CustomAuthenticationStateProvider < /code> код: < /p>
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly ISessionStorageService _sessionStorage;
public CustomAuthenticationStateProvider(ISessionStorageService sessionStorage)
{
_sessionStorage = sessionStorage;
}
public override async Task GetAuthenticationStateAsync()
{
var userModel = await _sessionStorage.GetItemAsync("userModel");
var identity = new ClaimsIdentity();
if (userModel != null)
{
identity = new ClaimsIdentity( new []
{
//Some my claims
...
}, "api");
}
else
{
identity = new ClaimsIdentity();
}
var claimsPrincipal = new ClaimsPrincipal(identity);
return new AuthenticationState(claimsPrincipal);
}
public void AuthenticateUser(AuthorizedModel model)
{
var identity = new ClaimsIdentity(new []
{
//Some my claims
...
});
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}
public async Task LogUserOut()
{
await _sessionStorage.RemoveItemAsync("nickName");
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}
}
< /code>
my login: < /p>
public async Task HandleValidSubmit()
{
var authorizedUser = await loginRepository.TryLogin(_model);
...
((CustomAuthenticationStateProvider)authenticationStateProvider).AuthenticateUser(authorizedUser);
await sessionStorage.SetItemAsync("userModel", authorizedUser);
navigationManager.NavigateTo("/");
//This is for my custom page reload
authorizationState.LoggedIn = true;
}
< /code>
my mainlayout: < /p>
@inherits LayoutComponentBase
...
//Some block of code for non-authorized
...
...
< /code>
и, наконец, пользовательский код: < /p>
@using System.Security.Claims
...
@userFirstName
[b]@userSecondName[/b]
@userNickName
[i][/i]
Online
@code{
[CascadingParameter]
private Task authenticationStateTask { get; set; }
ClaimsPrincipal user;
string userFirstName;
...
protected override async Task OnInitializedAsync()
{
user = (await authenticationStateTask).User;
//Here I just get userInfo from claims
...
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/61783060/blazornotifyauthenticationstatechanged-doesnt-update-authorized-based-elements[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия