i am trying to implement login method in asp.net. My problem is that my controller return that loging was successful, but I cant access any method marked as [authorize] - it returns http 401. From the begining, my appsetings.json:
"JWTSettings": {
"securityKey": "CoffeeShareSecretKey",
"validIssuer": "CoffeShare",
"validAudience": "https://localhost:44331",
"expiryInMinutes": 5
},
JWT in startup.cs:
var jwtSettings = Configuration.GetSection("JwtSettings");
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings.GetSection("validIssuer").Value,
ValidAudience = jwtSettings.GetSection("validAudience").Value,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.GetSection("securityKey").Value))
};
});
services.AddScoped<JwtHandler>();
JwtHandler.cs:
public class JwtHandler
{
private readonly IConfiguration _configuration;
private readonly IConfigurationSection _jwtSettings;
private readonly UserManager<User> _userManager;
public JwtHandler(IConfiguration configuration, UserManager<User> userManager)
{
_configuration = configuration;
_userManager = userManager;
_jwtSettings = _configuration.GetSection("JwtSettings");
}
public SigningCredentials GetSigningCredentials()
{
var key = Encoding.UTF8.GetBytes(_jwtSettings.GetSection("securityKey").Value);
var secret = new SymmetricSecurityKey(key);
return new SigningCredentials(secret, SecurityAlgorithms.HmacSha256);
}
public async Task<List<Claim>> GetClaims(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Email)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
return claims;
}
public JwtSecurityToken GenerateTokenOptions(SigningCredentials signingCredentials, List<Claim> claims)
{
var tokenOptions = new JwtSecurityToken(
issuer: _jwtSettings.GetSection("validIssuer").Value,
audience: _jwtSettings.GetSection("validAudience").Value,
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_jwtSettings.GetSection("expiryInMinutes").Value)),
signingCredentials: signingCredentials);
return tokenOptions;
}
}
UsersController.cs:
[ApiController]
[Route("users")]
public class UsersController : ControllerBase
{
private readonly SignInManager<User> _signInManager;
private readonly UserManager<User> _userManager;
private readonly JwtHandler _jwtHandler;
public UsersController(SignInManager<User> signInManager, UserManager<User> userManager, JwtHandler jwtHandler)
{
_signInManager = signInManager;
_userManager = userManager;
_jwtHandler = jwtHandler;
}
[HttpPost]
[Route("Login")]
public async Task<IActionResult> Login(UserDto userDto)
{
var user = await _userManager.FindByNameAsync(userDto.Email);
var signingCredentials = _jwtHandler.GetSigningCredentials();
var claims = await _jwtHandler.GetClaims(user);
var tokenOptions = _jwtHandler.GenerateTokenOptions(signingCredentials, claims);
var token = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
await _signInManager.PasswordSignInAsync(userDto.Email, userDto.Password, false, false);
return Ok(new AuthResponseDto {IsAuthSuccessful = true, Token = token});
}
Model and dto classes:
public class AuthResponseDto
{
public bool IsAuthSuccessful { get; set; }
public string ErrorMessage { get; set; }
public string Token { get; set; }
}
public class UserDto
{
public string Email { get; set; }
public string Password { get; set; }
}
public class User : IdentityUser<int>
{
public DateTime JoinedDate { get; set; } = DateTime.Now;
}



