您好,我正在努力了解如何在工作中使用Jwt实现Web Api。我希望用户仅使用Api进行一次身份验证,并获得一个令牌,供他们在我们Intranet中的所有应用程序之间使用。
Web Api可以工作,当我使用邮递员时,可以使用身份验证令牌从中检索信息
这是我的登录控制器
[Route("api/[controller]")]
[ApiController]
public class LoginController : Controller
{
private IConfiguration _config;
public LoginController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
[HttpPost]
public IActionResult Login([FromBody] UserViewModel login)
{
IActionResult response = Unauthorized();
var user = AuthenticateUser(login);
if (user != null)
{
var tokenString = GenerateJSONWebToken(user);
response = Ok(new { token = tokenString });
}
return response;
}
private string GenerateJSONWebToken(UserViewModel userInfo)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[] {
new Claim(JwtRegisteredClaimNames.Sub, userInfo.Username),
new Claim(JwtRegisteredClaimNames.Email, userInfo.Email),
new Claim("DateOfJoin", userInfo.DateOfJoin.ToString("yyyy-MM-dd")),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(_config["Jwt:Issuer"],
_config["Jwt:Issuer"],
null,
expires: DateTime.Now.AddMinutes(120),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
private UserViewModel AuthenticateUser(UserViewModel login)
{
UserViewModel user = null;
// Validate the User Credentials
if (login.Username == "test")
{
user = new UserViewModel { Username = "test", Nome = "test", Email = "test@test.com" };
}
return user;
}
[HttpGet]
[Authorize]
public ActionResult<IEnumerable<string>> Get()
{
var currentUser = HttpContext.User;
int spendingTimeWithCompany = 0;
if (currentUser.HasClaim(c => c.Type == "DateOfJoin"))
{
DateTime date = DateTime.Parse(currentUser.Claims.FirstOrDefault(c => c.Type == "DateOfJoin").Value);
spendingTimeWithCompany = DateTime.Today.Year - date.Year;
}
if (spendingTimeWithCompany > 5)
{
return new string[] { "High Time1", "High Time2", "High Time3", "High Time4", "High Time5" };
}
else
{
return new string[] { "value1", "value2", "value3", "value4", "value5" };
}
}
}
现在我的问题是,我试图了解当客户需要输入应用程序并使用它时,如何处理这些客户。
现在的问题是...
我实际上如何在客户端上访问此令牌并获得索赔?
例如,假设我有一个MVC客户端,并且用户正在尝试访问需要管理员声明授权的页面。我现在该怎么办?我不知道我是否可以通过HttpContext访问声明,还是必须做一些事情来检测每个客户端上的Jwt令牌。