Asp.Net Core未经授权的登录-C#

时间:2019-03-26 09:42:49

标签: c# asp.net asp.net-web-api asp.net-core password-encryption

我不知道我的标题是否正确。但是我有一个简单的问题。

我无法登录。难道是因为encrypted data我无法decrypt正确吗?

基本上,我有一个注册方法。

这是我的AuthRepository

public class AuthRepository : IAuthRepository
    {
        private readonly DataContext _context;

        public AuthRepository(DataContext context)
        {
            _context = context;
        }

        public async Task<User> Login(string username, string password)
        {
            var user = await _context.Users.FirstOrDefaultAsync(x => x.Username == username);

            if (user == null)
                return null;

            if (!VerifyPasswordHash(password, user.PasswordHash, user.PasswordSalt))
                return null;

            return user;
        }

        private bool VerifyPasswordHash(string password, byte[] passwordHash, byte[] passwordSalt)
        {
            using (var hmac = new System.Security.Cryptography.HMACSHA512())
            {
                var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));

                for (int i = 0; i < computedHash.Length; i++)
                {
                    if (computedHash[i] != passwordHash[i])
                        return false;
                }
            }
            return true;
        }

        public async Task<User> Register(User user, string password)
        {
            byte[] passwordHash, passwordSalt;
            CreatePasswordHash(password, out passwordHash, out passwordSalt);

            user.PasswordHash = passwordHash;
            user.PasswordSalt = passwordSalt;

            await _context.Users.AddAsync(user);
            await _context.SaveChangesAsync();

            return user;
        }

        private void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt)
        {
            using (var hmac = new System.Security.Cryptography.HMACSHA512())
            {
                passwordSalt = hmac.Key;
                passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
            }
        }

        public async Task<bool> UserExists(string username)
        {
            if (await _context.Users.AnyAsync(x => x.Username == username))
                return true;
            return false;
        }
    }

我的register在工作。我使用Postman

进行了测试

但是为什么我不能登录?

decrpyting的用户encrypted尝试解决了几个小时,我的registered数据[Route("api/[controller]")] [ApiController] public class AuthController : ControllerBase { private readonly IAuthRepository _repo; private readonly IConfiguration _config; public AuthController(IAuthRepository repo, IConfiguration config) { _repo = repo; _config = config; } [HttpPost("register")] public async Task<IActionResult> Register(UserForRegisterDto userForRegisterDto) { userForRegisterDto.Username = userForRegisterDto.Username.ToLower(); if (await _repo.UserExists(userForRegisterDto.Username)) return BadRequest("Username already exist"); var userToCreate = new User { Username = userForRegisterDto.Username }; var createdUser = await _repo.Register(userToCreate, userForRegisterDto.Password); return StatusCode(201); } [HttpPost("login")] public async Task<IActionResult> Login(UserForLoginDto userForLoginDto) { var userFromRepo = await _repo.Login(userForLoginDto.Username.ToLower(), userForLoginDto.Password); if (userFromRepo == null) return Unauthorized(); return Ok(); } } 有什么问题吗?但是我不能使它工作。我正在观看视频教程。但是我找不到与本教程和我的教程有所不同。

Unauthorized login

我真的很喜欢这部分。请帮我。谢谢。

我没有遇到任何错误。

但是我在调​​试程序时注意到了这一点

enter image description here

enter image description here

数组结果不同。这是 <template> <div class="drag"> <div v-for="n in range" :key="n" class="box" @dragenter="dragEnter" @dragover="dragOver" @dragleave="dragLeave" @drop="dragDrop" > <div v-if="n === 1" class="fill" draggable="true" @dragstart="dragStart" @dragend="dragEnd" /> </div> </div> </template> <script> export default { name: 'Drag', props: { range: { type: Number, default: 5 } }, data() { return { dragged: '' } }, methods: { dragEnter: function(e) { e.target.className += ' hovered' }, dragOver: function(e) { e.preventDefault() }, dragLeave: function(e) { e.target.className = 'box' }, dragDrop: function(e) { e.target.className = 'box' e.target.appendChild(this.dragged) }, dragStart: function(e) { e.target.className += ' ondrag' this.dragged = e.target setTimeout(() => (e.target.className = 'invisible'), 0) }, dragEnd: function(e) { e.target.className = 'fill' } } } </script> <style> .drag { background-color: darksalmon; display: flex; justify-content: flex-start; } .box { background-color: white; width: 160px; height: 160px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); margin-right: 15px; border: 3px white solid; } .fill { background-image: url('http://source.unsplash.com/random/150x150'); width: 150px; height: 150px; margin: 5px 5px; cursor: pointer; } .ondrag { border: solid #ccc 4px; } .invisible { display: none; } .hovered { background: #f4f4f4; border-style: dashed; } </style>

的原因吗

如果是这样。我如何正确验证用户名和密码。

我还检查了我在网络api中传递的用户名和密码是否正确(纯文本)。

1 个答案:

答案 0 :(得分:0)

我检查过的问题是,当您创建和比较System.Security.Cryptography.HMACSHA512()的对象时,由于此原因,它总是生成不同的哈希值。解决方案是为此类声明一个全局对象,并且在创建和验证哈希时必须使用该对象。我检查了在全局声明后,它对我而言工作正常。