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

Authentication 在ASP.NET Core中使用基于本地存储的JWT令牌更改用户密码(ASP.Identity),authentication,jwt,blazor,asp.net-core-3.1,usermanager,Authentication,Jwt,Blazor,Asp.net Core 3.1,Usermanager,你好, 我是一名刚刚起步的C#开发人员,正在尝试使用ASP.NET Core完成我的第一步 现在我需要一些外部帮助。 我开发了一个基于Blazor的网站,并向我的数据库中添加了一些用户。 现在我想为loggedin用户添加一个更改密码的功能。 我的项目分为服务器端和客户端。 客户端包含所有my blazor/razor页面,包括ChangePasswordView,服务器端接收来自客户端的REST请求 为了获得授权,我使用了JWT(JSON WebToken),并将此标记和一些声明添加到浏览器中

你好, 我是一名刚刚起步的C#开发人员,正在尝试使用ASP.NET Core完成我的第一步

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

为了获得授权,我使用了JWT(JSON WebToken),并将此标记和一些声明添加到浏览器中的本地存储中

程序如下:

  • 用户已登录
  • 用户输入旧密码和新密码,然后点击提交按钮
  • 请求函数从客户端转到服务器端
  • POST请求到达服务器端UserController类,该类包含“
    ChangePassword(ChangePasswordModel pwModel)
    ”方法。它成功接收带有旧密码和新密码的pwModel
  • 。。。。现在我有一些问题。。。。我想我必须从本地browserstorage或类似的地方验证JWTtoken,因为
    \u userManager.GetUserAsync(User)
    总是返回null
  • 如何帮助我解决这个问题,以获得一个完整的功能“changePassword”方法,以及您需要什么信息

    致以最良好的祝愿, 拉里


    p、 很抱歉,这是我关于Stackoverflow的第一个问题,我试图尽可能地描述这个问题。

    似乎有点,您忘记了实施一些细节。 首先,您需要将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))
                    };
                });
    
    控制器方法必须使用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(...);
        }
    

    令人惊叹的!这是一个完美的解决方案,但对于我的项目,我只需要ConfigureServices中的代码片段
        [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(...);
        }
    
    HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);