Привет. Я очень стараюсь понять, как реализовать Web Api с Jwt для моей интрасети на работе. Я хочу, чтобы пользователи проходили аутентификацию только один раз с использованием API и получали токен, который они могут использовать между всеми приложениями в нашей интрасети.
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" };
}
}
}
Теперь моя проблема в том, что я пытаюсь понять, как это обрабатывается среди клиентов, когда им нужно войти в приложение и использовать его.
- Все приложения имеют ограниченный доступ и перенаправляются на веб-интерфейс API для входа в систему.
- Имя пользователя и пароль отправляются в веб-API.
- Учетные данные проверяются с использованием каталога доступа
- Маркер JWT возвращается, если проверка прошла успешно с утверждениями.
Проблема здесь сейчас ...
Как мне получить доступ к этому токену на клиентах и получить претензии?
Например, допустим, у меня есть клиент MVC, и пользователь пытается получить доступ к странице, на которой требуется авторизация от имени администратора. Что я должен делать на этом этапе? Я не знаю, могу ли я просто получить доступ к претензиям через HttpContext или мне нужно что-то сделать, чтобы обнаружить токен Jwt на каждом клиенте.