Authentication 在ASP.NET Core中使用基于本地存储的JWT令牌更改用户密码(ASP.Identity)
你好, 我是一名刚刚起步的C#开发人员,正在尝试使用ASP.NET Core完成我的第一步 现在我需要一些外部帮助。 我开发了一个基于Blazor的网站,并向我的数据库中添加了一些用户。 现在我想为loggedin用户添加一个更改密码的功能。 我的项目分为服务器端和客户端。 客户端包含所有my blazor/razor页面,包括ChangePasswordView,服务器端接收来自客户端的REST请求 为了获得授权,我使用了JWT(JSON WebToken),并将此标记和一些声明添加到浏览器中的本地存储中 程序如下: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),并将此标记和一些声明添加到浏览器中
ChangePassword(ChangePasswordModel pwModel)
”方法。它成功接收带有旧密码和新密码的pwModel\u userManager.GetUserAsync(User)
总是返回nullp、 很抱歉,这是我关于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);