在 ASP.NET Core 中使用基于本地存储的 JWT-Token 更改用户密码 (ASP.Identity)
Change Userpassword (ASP.Identity) with localstorage based JWT-Token in ASP.NET Core
美好的一天,
我是 C# 开发新手,正在尝试使用 ASP.NET Core 迈出我的第一步。
现在我正处于需要一些外部帮助的地步。
我开发了一个基于 Blazor 的网站并将一些用户添加到我的数据库中。
现在我想为登录用户添加一个功能来更改他们的密码。
我的项目分为服务器端和客户端。
客户端包含我所有的 blazor/razor 页面,包括 ChangePasswordView,服务器端接收来自客户端的 REST 请求。
为了获得授权,我使用了 JWT (JSON WebToken),并且我将带有一些声明的令牌添加到浏览器中的本地存储中。
程序如下:
- 用户已登录
- 用户输入旧密码和新密码并点击提交按钮
- 请求函数从client端到server端
- POST-请求到达包含“
ChangePassword(ChangePasswordModel pwModel)
”方法的服务器端 UserController class。成功接收新旧密码pwModel
- ...现在我遇到了一些问题....我想我必须从本地浏览器存储或类似的东西验证 JWTtoken,因为
_userManager.GetUserAsync(User)
总是 returns null .
如何帮助我解决此问题以获得功能齐全的“changePassword”方法以及您需要哪些信息?
此致,
拉里
p.s。抱歉,这是我在 Whosebug 上的第一个问题,我尽力描述了这个问题。
好像有点,你忘了实现一些细节。
首先,你需要为你的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 请求必须具有授权 header。
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
美好的一天, 我是 C# 开发新手,正在尝试使用 ASP.NET Core 迈出我的第一步。
现在我正处于需要一些外部帮助的地步。 我开发了一个基于 Blazor 的网站并将一些用户添加到我的数据库中。 现在我想为登录用户添加一个功能来更改他们的密码。 我的项目分为服务器端和客户端。 客户端包含我所有的 blazor/razor 页面,包括 ChangePasswordView,服务器端接收来自客户端的 REST 请求。
为了获得授权,我使用了 JWT (JSON WebToken),并且我将带有一些声明的令牌添加到浏览器中的本地存储中。
程序如下:
- 用户已登录
- 用户输入旧密码和新密码并点击提交按钮
- 请求函数从client端到server端
- POST-请求到达包含“
ChangePassword(ChangePasswordModel pwModel)
”方法的服务器端 UserController class。成功接收新旧密码pwModel - ...现在我遇到了一些问题....我想我必须从本地浏览器存储或类似的东西验证 JWTtoken,因为
_userManager.GetUserAsync(User)
总是 returns null .
如何帮助我解决此问题以获得功能齐全的“changePassword”方法以及您需要哪些信息?
此致, 拉里
p.s。抱歉,这是我在 Whosebug 上的第一个问题,我尽力描述了这个问题。
好像有点,你忘了实现一些细节。 首先,你需要为你的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 请求必须具有授权 header。
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);