使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)