我不知道我的标题是否正确。但是我有一个简单的问题。
我无法登录。难道是因为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
我真的很喜欢这部分。请帮我。谢谢。
我没有遇到任何错误。
但是我在调试程序时注意到了这一点
数组结果不同。这是 <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中传递的用户名和密码是否正确(纯文本)。
答案 0 :(得分:0)
我检查过的问题是,当您创建和比较System.Security.Cryptography.HMACSHA512()的对象时,由于此原因,它总是生成不同的哈希值。解决方案是为此类声明一个全局对象,并且在创建和验证哈希时必须使用该对象。我检查了在全局声明后,它对我而言工作正常。