C# 密码自动更新

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令牌时它都会更新密码,这不允许用户

具有.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生成令牌代码

    [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是的,您是对的,添加兼容性对我很有效