Как обрабатывать аутентификацию и авторизацию с помощью Jwt в Asp .Net Clients - PullRequest
0 голосов
/ 26 марта 2019

Привет. Я очень стараюсь понять, как реализовать Web Api с Jwt для моей интрасети на работе. Я хочу, чтобы пользователи проходили аутентификацию только один раз с использованием API и получали токен, который они могут использовать между всеми приложениями в нашей интрасети.

Web Api работает, и я могу получить информацию из него с помощью токена аутентификации, когда я использую Почтальон

enter image description here

Это мой контроллер входа в систему

[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" };
        }
    }
}

Теперь моя проблема в том, что я пытаюсь понять, как это обрабатывается среди клиентов, когда им нужно войти в приложение и использовать его.

  1. Все приложения имеют ограниченный доступ и перенаправляются на веб-интерфейс API для входа в систему.
  2. Имя пользователя и пароль отправляются в веб-API.
  3. Учетные данные проверяются с использованием каталога доступа
  4. Маркер JWT возвращается, если проверка прошла успешно с утверждениями.

Проблема здесь сейчас ...

Как мне получить доступ к этому токену на клиентах и ​​получить претензии?

Например, допустим, у меня есть клиент MVC, и пользователь пытается получить доступ к странице, на которой требуется авторизация от имени администратора. Что я должен делать на этом этапе? Я не знаю, могу ли я просто получить доступ к претензиям через HttpContext или мне нужно что-то сделать, чтобы обнаружить токен Jwt на каждом клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...