BlazornotifyAuthenticationStateChanged не обновляет авторизованные элементыC#

Место общения программистов C#
Ответить
Anonymous
 BlazornotifyAuthenticationStateChanged не обновляет авторизованные элементы

Сообщение 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
@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
Ответить

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

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

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

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

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