使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false
Posted
技术标签:
【中文标题】使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false【英文标题】:Sign out a user using AuthenticationStateProvider and set User.Identity.IsAuthenticated to false using Blazor 【发布时间】:2020-07-03 07:21:31 【问题描述】:我继承了一个用 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()
方法中,该方法在单击“注销”链接时执行。我正在从 Blazor 的会话存储中删除“用户”会话,但是当调用 principal.Identity.IsAuthenticated
时,它仍然以 true
的形式返回?
有谁知道我在注销时如何将IsAuthenticated
设置为false
?
【问题讨论】:
欢迎来到 Stack Overflow,史蒂文。这是一个非常好的第一篇文章。它被清楚地传达,专注于一个问题,包括相关代码,并被适当地标记。我不知道我脑海中的答案,但假设这里的某个人应该能够提供帮助。 【参考方案1】:原则上,您的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 令牌。如果它为空,则创建一个没有声明的新 ClaimsIdentity
对象。如果它不为空,则创建一个新的 ClaimsIdentity
对象,其中包含您提供给它的声明,并将此对象传递给 ClaimsPrincipal
的构造函数。
【讨论】:
谢谢!我将 GetAuthenticationStateAsync() 方法简化为与您的版本非常相似的方法,现在我具有注销功能。 您好,如果您发布了您的注销功能如何删除用户以及您如何简化 GetAuthenticationStatAsync 以便整个解决方案都在这里,那就太好了。我有同样的问题,但这篇文章只提供了部分答案。以上是关于使用 AuthenticationStateProvider 注销用户并使用 Blazor 将 User.Identity.IsAuthenticated 设置为 false的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)