您好,我是一个非常初级的C#开发人员,正在尝试使用ASP.NET Core完成我的第一步。
现在我正处于一个需要一些外部帮助的时刻。我开发了一个基于Blazor的网站,并在数据库中添加了一些用户。现在我想为loggedin用户添加一个更改密码的功能。我的项目分为服务器端和客户端。客户端包含我的所有blazor/razor页面,包括ChangePasswordView,服务器端接收来自客户端的REST请求。
为了获得授权,我使用JWT(JSON WebToken(,并在浏览器中的本地存储中添加了该令牌和一些声明。
程序如下:
- 用户已登录
- 用户输入旧密码和新密码并点击提交按钮
- 请求函数从客户端转到服务器端
- POST请求到达服务器端UserController类,该类包含一个";CCD_ 1";方法它成功地接收到带有旧密码和新密码的pwModel
- 。。。。现在我遇到了一些问题。。。。我想我必须从本地浏览器存储或类似的东西中验证JWTtoken,因为
_userManager.GetUserAsync(User)
总是返回null
如何帮助我解决这个问题以获得完整的功能";changePassword";方法和你需要什么信息?
谨致问候,拉里
p.s.很抱歉,这是我在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))
};
});
配置:
app.UseAuthentication();
app.UseAuthorization();
控制器方法必须用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);