[英]Asp.Net Core Unauthorized login - C#
不知道我的標題對不對。 但我有一個簡單的問題。
我無法登錄。 這是因為我無法正確decrypt
encrypted data
嗎?
基本上,我有一個注冊方法。
這是我的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
測試過
但是為什么我不能登錄?
我在用戶registered
時encrypted
數據有什么問題decrpyting
我已經嘗試解決了幾個小時了。 但我不能讓它工作。 我正在關注視頻教程。 但是我找不到教程中的和我的有什么不同。
[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
的原因嗎
如果是這樣的話。 如何正確驗證用戶名和密碼。
我還檢查了我在 web api 中傳遞的用戶名和密碼是否正確(純文本)。
我檢查過的問題是,當您創建和比較 System.Security.Cryptography.HMACSHA512() 的對象時,它總是會生成不同的哈希值。 解決方案是為此類聲明一個全局對象,並且在創建和驗證哈希時必須使用該對象。 我已經檢查過了。 在全局聲明后,它在我的情況下工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.