我在Blazor 5.0中遇到了一个关于角色管理的问题。
当用户已经通过身份验证时,我想添加或删除角色。在我的页面中,我经常使用
[CascadingParameter]
protected Task<AuthenticationState> AuthState { get; set; }
检查用户是否具有正确的角色。
有一次,我使用这种方法来更新角色,然后发生了一个意想不到的行为:
protected async Task Cancel()
{
var User = await UM.GetUserAsync((await AuthState).User);
Console.WriteLine("---Before---");
var BoolAuth1 = (await AuthState).User.IsInRole(Utilisateur.Role_Abonne);
Console.WriteLine($"AuthState status for role : {BoolAuth1}");
var Bool1 =await UM.IsInRoleAsync(User, Utilisateur.Role_Abonne);
Console.WriteLine($"UserManager status for role : {Bool1}");
await UM.RemoveFromRoleAsync(User, Utilisateur.Role_Abonne);
Console.WriteLine("---After----");
var BoolAuth2 = (await AuthState).User.IsInRole(Utilisateur.Role_Abonne);
Console.WriteLine($"AuthState status for role : {BoolAuth2}");
var Bool2 = await UM.IsInRoleAsync(User, Utilisateur.Role_Abonne);
Console.WriteLine($"UserManager status for role : {Bool2}");
}
结果是:
---Before---
AuthState status for role : True
UserManager status for role : True
---After----
AuthState status for role : True
UserManager status for role : False
数据库中进行了更改,但AuthState没有刷新,即使重新加载页面也不能解决问题。我必须注销,然后重新登录以刷新AuthState。这很不幸,因为我在很多不同的页面中使用当前的AuthState和之类的东西
<AuthorizeView Roles="@Utilisateur.Role_Abonne">
<Authorized>
<button class="LogButton" @onclick="Cancel">
<h5 class="LogButtonText">
Disconnect
</h5>
</button>
</Authorized>
<NotAuthorized>
<button class="LogButton">
<h5 class="LogButtonText" @onclick="Register">
Connect
</h5>
</button>
</NotAuthorized>
</AuthorizeView>
如何在不强制用户注销的情况下刷新AuthState?
该用户有相同的问题,但没有给出响应。
我目前的破解,工作直到用户重新加载页面是
protected Task<AuthenticationState> NewTask;
public void RaiseAuthStateChanged(ClaimsPrincipal Claim)
{
NewTask = Task.FromResult(new AuthenticationState(Claim));
NotifyAuthenticationStateChanged(NewTask);
}
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
if (NewTask != null) return NewTask;
else return base.GetAuthenticationStateAsync();
}
但我觉得这很丑陋,我甚至不知道这是否会引发安全问题。
我认为用户需要注销并重新登录以查看更新的角色等是一个已知的问题/限制。
我当然记得在播客等中听到过这个问题