gpt4 book ai didi

asp.net-core - 使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false

转载 作者:行者123 更新时间:2023-12-03 02:32:03 25 4
gpt4 key购买 nike

我继承了一个用 Blazor 和 .NET Core 3.1 编写的网站,我需要向用户提供一个“注销”按钮。该网站使用 AuthenticationStateProvider 的自定义实现,使用以下 GetAuthenticationStateAsync() 方法:

public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
ClaimsIdentity identity = new ClaimsIdentity();

if (_currentUser != null)
{
identity = GenerateClaimsForCurrentUser();
}
else
{
try
{
var user = await sessionStorage.GetItemAsync<Credentials>("User");
if (user != null && await IsAuthentic(user))
{
_currentUser = await UserInfo(user);
identity = GenerateClaimsForCurrentUser();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

return new AuthenticationState(new ClaimsPrincipal(identity));
}

要验证用户是否已登录,代码为:

AuthenticationState authState = await authenticationState.GetAuthenticationStateAsync();
ClaimsPrincipal principal = authState.User;

if (principal.Identity.IsAuthenticated)
{
...
}

问题出在我编写的 Logout() 方法中,该方法在单击“Logout”链接时执行。我正在从 Blazor 的 session 存储中删除“User” session ,但是当调用 principal.Identity.IsAuthenticated 时,它仍然返回为 true

有人知道注销时如何将 IsAuthenticated 设置为 false 吗?

最佳答案

原则上,您的 GetAuthenticationStateAsync 方法应与此类似:

 public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var token = await GetTokenAsync();
var identity = string.IsNullOrEmpty(token)
? new ClaimsIdentity()
: new ClaimsIdentity(GenerateClaimsForCurrentUser(), "jwt");
return new AuthenticationState(new ClaimsPrincipal(identity));
}

注意:GetTokenAsync 方法从本地存储中检索 JWT token 。如果它为空,您将创建一个没有声明的新 ClaimsIdentity 对象。如果它不为空,则创建一个新的 ClaimsIdentity 对象,其中包含您提供给它的声明,并且该对象将传递给 ClaimsPrincipal 的构造函数。

关于asp.net-core - 使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60803232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com