Я новичок в C #, и я борюсь с авторизацией в веб-приложении ASP.Net Core 3.1 MVC. Я знаю, что в Google много инструкций, я читал и смотрел в течение 3 дней, но не могу с этим справиться, потому что каждая инструкция Я обнаружил, что он использует другой способ, и я действительно запутался.

Идея моей системы:

Шаг 1. Я отправляю имя пользователя и пароль в свой API, и он отправляет в ответ токен JWT (если учетная запись верна).

Шаг 2. Я декодирую токен и получаю имя пользователя, адрес электронной почты, роль для своего веб-сайта, устанавливаю заголовок HttpClient для других запросов.

Мои проблемы:

  1. Как и где установить заголовок HttpClient (с моим токеном) только один раз при входе пользователя в систему
  2. Как заставить пользователей оставаться на странице входа, если они еще не вошли в систему

Вот мой метод входа в систему

[HttpPost, AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginViewModel account)
        {
            string url = "accounts/signin";
            var response = await new HttpClientHelper<LoginViewModel>().PostRequest(url, account);
            var userToken = JsonConvert.DeserializeObject<UserToken>(response);
            Console.Out.WriteLine(userToken.Token);

            if (userToken.Token != null)
            {
                var token = new JwtSecurityToken(jwtEncodedString: userToken.Token);
                var userId = token.Claims.First(c => c.Type == "userId").Value;
                var username = token.Claims.First(c => c.Type == "unique_name").Value;
                var role = token.Claims.First(c => c.Type == "role").Value;
                HttpContext.Session.SetString("token", token.ToString());
                HttpContext.Session.SetString("userId", userId);
                HttpContext.Session.SetString("username", username);
                HttpContext.Session.SetString("role", role);
                return RedirectToAction("Home", "Index");
            }
            return RedirectToAction("Login", "Login");
        }

Моя модель для получения ответа от api

public class UserToken
    {
        public string Token { get; set; }
        public string ValidFrom { get; set; }
        public string ValidTo { get; set; }
        
    }

К вашему сведению: я уже получил ответ от api и получил токен, но я должен устанавливать заголовок HttpClient каждый раз, когда я делаю запрос ..

0
Bao 25 Ноя 2020 в 13:52

1 ответ

Лучший ответ

Как и где установить заголовок HttpClient (с моим токеном) только один раз при входе пользователя в систему

Насколько мне известно, мы не могли установить заголовок httpclient только один раз при входе пользователя в систему. Обычно мы можем сохранить токен в сеансе или cookie, а затем прочитать его из файла cookie или сеанса, когда вы хотите отправить запрос в веб-API.

Как заставить пользователей оставаться на странице входа, если они еще не вошли в систему

Для этого требования я предлагаю вам рассмотреть возможность использования промежуточного программного обеспечения аутентификации для выполнения вашего требования.

Вы можете проверить сеанс пользователя внутри этого промежуточного программного обеспечения, если этот пользователь не содержит сеанс, вы можете изменить путь запроса на страницу входа.

Более подробную информацию вы можете найти в примере ниже:

      //Below cods should add after app.usesession in startup.cs Configure method
      app.Use((context, next) =>
        {
            string token = context.Session.GetString("token");
            if (token == null)
            {
                context.Request.Path = "/account/login";
            }               
            return next.Invoke();
        });
0
Brando Zhang 26 Ноя 2020 в 05:14