C# 密码自动更新
具有.Net核心的Asp.Net Web API正在生成JWT令牌时自动更新密码 因此,首先,我有一个带有asp net成员表的MVC5应用程序,并希望使用.net core为其创建一个API 并支持MVC5 Web应用程序和Web API。我为AspNetUsers表增加了四列(ConcurrencyStamp、LockoutEnd、normalizedmail、NormalizedUserName) 虽然我能够获得JWT令牌而没有任何问题,但每次我生成JWT令牌时它都会更新密码,这不允许用户从MV5 web APP登录 下面是JWT生成令牌代码C# 密码自动更新,c#,.net,api,asp.net-core,jwt,C#,.net,Api,Asp.net Core,Jwt,具有.Net核心的Asp.Net Web API正在生成JWT令牌时自动更新密码 因此,首先,我有一个带有asp net成员表的MVC5应用程序,并希望使用.net core为其创建一个API 并支持MVC5 Web应用程序和Web API。我为AspNetUsers表增加了四列(ConcurrencyStamp、LockoutEnd、normalizedmail、NormalizedUserName) 虽然我能够获得JWT令牌而没有任何问题,但每次我生成JWT令牌时它都会更新密码,这不允许用户
[Route("login")] // /login
[HttpPost]
public async Task<ActionResult> Login([FromBody] LoginViewModel
model)
{
try
{
var user = await
_userManager.FindByNameAsync(model.Username);
if (user != null && await
_userManager.CheckPasswordAsync(user, model.Password))
{
var claim = new[] {
new Claim(JwtRegisteredClaimNames.Sub, user.Id)
};
var signinKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration["Jwt:SigningKey"]));
int expiryInMinutes =
Convert.ToInt32(_configuration["Jwt:ExpiryInMinutes"]);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Site"],
claims: claim,
audience: _configuration["Jwt:Site"],
expires: DateTime.UtcNow.AddMinutes(expiryInMinutes),
signingCredentials: new SigningCredentials(signinKey,
SecurityAlgorithms.HmacSha256)
);
return Ok(
new
{
token = new
JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo,
userName = user.UserName
});
}
return Unauthorized();
}
catch (Exception ex)
{
return Unauthorized();
}
}
[路由(“登录”)]///登录
[HttpPost]
公共异步任务登录([FromBody]LoginViewModel)
模型)
{
尝试
{
var user=wait
_FindByNameAsync(model.Username);
if(user!=null&&wait
_userManager.CheckPasswordAsync(用户、模型、密码))
{
var索赔=新[]{
新索赔(JwtRegisteredClaimNames.Sub,user.Id)
};
var signinKey=新对称性安全性(
Encoding.UTF8.GetBytes(_配置[“Jwt:SigningKey”]);
int expiryin分钟=
转换为32(_配置[“Jwt:ExpiryInMinutes]”);
var token=新的JwtSecurityToken(
发卡机构:_配置[“Jwt:站点”],
索赔:索赔,
受众:_配置[“Jwt:站点”],
expires:DateTime.UtcNow.AddMinutes(expireyMinutes),
signingCredentials:新的signingCredentials(signinKey,
安全算法(HmacSha256)
);
返回Ok(
新的
{
令牌=新
JwtSecurityTokenHandler().WriteToken(令牌),
expiration=token.ValidTo,
userName=user.userName
});
}
未经授权返回();
}
捕获(例外情况除外)
{
未经授权返回();
}
}
请告诉我如何在生成JWT令牌时停止更新AspNetUsers中的PasswordHash和SecurityStamp列
更新:CheckPasswordAsync(在web API中使用)方法正在更新密码字段,而PasswordSignInAsync方法在web app中使用@KirkLarin,非常感谢,它通过在Configure service method下的StartUp.cs文件中添加以下代码帮助我解决了问题
public void ConfigureServices(IServiceCollection services)
{
services.Configure<PasswordHasherOptions>(options => options.CompatibilityMode =
PasswordHasherCompatibilityMode.IdentityV2);
}
public void配置服务(IServiceCollection服务)
{
services.Configure(选项=>options.CompatibilityMode=
PasswordHasher CompatibilityMode.IdentityV2);
}
听起来您可能需要将密码哈希器设置回IdentityV2
。对于asp.net核心标识,它不会通过CheckPasswordAsync
更新密码哈希。是否有任何演示重现您的问题。@KirkLarkin是的,您是对的,添加兼容性对我很有效