在 ASP.NET Core 中使用基于本地存储的 JWT-Token 更改用户密码(ASP.Identity)

Posted

技术标签:

【中文标题】在 ASP.NET Core 中使用基于本地存储的 JWT-Token 更改用户密码(ASP.Identity)【英文标题】:Change Userpassword (ASP.Identity) with localstorage based JWT-Token in ASP.NET Core 【发布时间】:2021-08-02 14:01:13 【问题描述】:

美好的一天, 我是一个刚起步的 C# 开发人员,正在尝试使用 ASP.NET Core 迈出第一步。

现在我需要一些外部帮助。 我开发了一个基于 Blazor 的网站并将一些用户添加到我的数据库中。 现在我想为登录用户添加一个更改密码的功能。 我的项目分为服务器端和客户端。 客户端包含我所有的 blazor/razor 页面,包括 ChangePasswordView,服务器端接收来自客户端的 REST 请求。

为了授权,我使用的是 JWT (JSON WebToken),我在浏览器的本地存储中添加了带有一些声明的这个令牌。

流程如下:

    用户已登录 用户输入旧密码和新密码并点击提交按钮 请求函数从客户端到服务器端 POST 请求到达包含“ChangePassword(ChangePasswordModel pwModel)”方法的服务器端 UserController 类。成功接收到新旧密码的 pwModel。 ....现在我遇到了一些问题....我想我必须从本地 browserstorage 或类似的地方验证 JWTtoken,因为_userManager.GetUserAsync(User) 总是返回 null。

如何帮助我解决此问题以获得功能齐全的“changePassword”方法以及您需要哪些信息?

最好的问候, 拉里

附言抱歉,这是我在 *** 上的第一个问题,我试图尽可能地描述这个问题。

【问题讨论】:

【参考方案1】:

好像有点,你忘了实现一些细节。 首先,您需要在 Startup 中添加 JWT 身份验证。

配置服务:

        services.AddAuthentication()
            .AddJwtBearer(option =>
            
                string jwtKey = Configuration.GetSection("Identity").GetSection("Token").GetValue<string>("JwtSecurityKey");

                option.TokenValidationParameters = new TokenValidationParameters()
                
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration.GetSection("Identity").GetSection("Token").GetValue<string>("JwtIssuer"),
                    ValidAudience = Configuration.GetSection("Identity").GetSection("Token").GetValue<string>("JwtAudience"),
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey))
                ;
            );

配置:

        app.UseAuthentication();
        app.UseAuthorization();

Controller 方法必须用 Authorize(AuthenticationSchemes = "Bearer") 属性修饰

    [HttpPost("ChangePasswort")]
    [Authorize(AuthenticationSchemes = "Bearer")]
    public async Task<IActionResult> ChangePasswortAsync([FromBody] ChangePasswordModel model)
    
        string claim = HttpContext.User.FindFirstValue(ClaimsIdentity.DefaultNameClaimType);

        var user = await UserManager.GetUserAsync(HttpContext.User);

        var result = await UserManager.ChangePasswordAsync(user, model.OldPassword, model.NewPassword);

        if(!result.Succeeded)
        
            ...
        
        ...
        return Ok(...);
    

当您调用控制器时,HTTP 请求必须具有 Authorization 标头。

HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);  

【讨论】:

太棒了!那是完美的解决方案,但对于我的项目,我只需要 ConfigureServices 的 sn-p

以上是关于在 ASP.NET Core 中使用基于本地存储的 JWT-Token 更改用户密码(ASP.Identity)的主要内容,如果未能解决你的问题,请参考以下文章

具有用户权限的基于 JWT 令牌的授权 Asp.net core 2.0

如何在 ASP.NET Core 中基于 appsettings 有条件地使用授权

使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌

ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用

ASP.NET Core 6.0 本地化

ASP.NET Core 6.0 本地化