【问题标题】:How to generate a JWT with Net Core如何使用 Net Core 生成 JWT
【发布时间】:2018-09-24 19:49:07
【问题描述】:

您好,我在使用 Net Core 创建令牌时感到困惑,我已按照指南进行操作,但在 Postman 中执行 Post 请求时无法正常工作。

看,我的数据库有 ef 核心迁移,我的 User 类有 UserName 和 Password {get;set;}。

然后我创建了一个包含以下内容的 AuthController:

public class AuthController : Controller
{
    private readonly IConfiguration _configuration;
    private readonly HacsysContext _context;
    public AuthController(IConfiguration configuration, HacsysContext context) {
        _configuration = configuration;
    }


    [AllowAnonymous]
    [HttpPost]
    [Route("token")]
    public IActionResult Post([FromBody]Personal personal)
    {
        if (ModelState.IsValid)
        {
            var userId = GetUserIdFromCredentials(personal);
            if (userId == -1)
            {
                return Unauthorized();
            }

            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, personal.CorreoE),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };

            var token = new JwtSecurityToken
            (
                issuer: _configuration["Issuer"],
                audience: _configuration["Audience"],
                claims: claims,
                expires: DateTime.UtcNow.AddDays(10),
                notBefore: DateTime.UtcNow,
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SigningKey"])),
                     SecurityAlgorithms.HmacSha256)
            );

            return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
        }

        return BadRequest();
    }

    private int GetUserIdFromCredentials(Personal personal)
    {
        var userId = -1;

        var email = personal.CorreoE;
        var password = personal.Contrasena;
        if (personal.CorreoE.Equals(email)) 
            {
                userId = 1;
            }



        return userId;


    }
}

基本上,当我在 GetUserIdFromCredentials 中比较电子邮件是否等于 peronal 时。CorreoE 总是返回 True,即使在 Postman 中我发送的 POST 中只有一个字母或不同的电子邮件或不在我的数据库中的不同电子邮件。

【问题讨论】:

    标签: asp.net-core jwt entity-framework-core


    【解决方案1】:

    您每次都获得 userId 1,因为您首先将电子邮件值设置为该值 personal.CorreoE 的值,然后比较 email 的值是否等于 personal.CorreoE.. 这总是正确的,因此返回 1。

    但是您应该做的是在 dbContext 中对 Personal 实体进行查询,以查找具有该电子邮件的人并返回找到的实体的 userId

    private int GetUserIdFromCredentials(Personal personal)
    {
        var email = personal.CorreoE;
        var password = personal.Contrasena;
    
        //make a query on the db context
        var dbPerson = _context.Personal.FirstOrDefault(p=> p.Email == email);
    
        if(dbPerson == null)
            return -1;
    
        return dbPerson.Id;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-15
      • 2021-01-17
      • 2021-05-17
      • 2018-03-29
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多