Заголовок авторизации не настроен

#c# #asp.net #asp.net-core #asp.net-web-api

Вопрос:

У меня есть один способ входа в систему, как показано ниже :

 public async Task<ActionResult> Index(LoginModel loginModel)
{
    string url = "API_URL";

    var response = await client.PostAsJsonAsync(url, loginModel);

    if (response.IsSuccessStatusCode)
    {
        string result = await response.Content.ReadAsStringAsync();
        var jsonData = JObject.Parse(result);

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer "   jsonData["accessToken"]);

        return RedirectToAction("PostLogin");
    }
    else
    {
        ModelState.AddModelError("", "These credentials does not work. Hmm..");
    }

    return View(loginModel);
}
 

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

Но в этом методе я не могу получить доступ к этому токену. Ниже приведен код для этого.

 public async Task<ActionResult> PostLogin()
{
    var accessToken = await HttpContext.GetTokenAsync("accessToken"); // Here I can't see token. and getting value as per below.

    return View();
}
 

Даже я получаю эту ошибку, как показано ниже :

InvalidOperationException: No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).

Комментарии:

1. Где client определена переменная?

2. @AleksaRistic вверху контроллера : общедоступный класс LoginController : Контроллер { HttpClient клиент = новый HttpClient();

3. Похоже, вы не настроили схему аутентификации по умолчанию в своем Startup классе, что-то вроде services.AddAuthentication(options => options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme)

4. @MartinCostello Я внес следующие изменения : общедоступные пустые службы конфигурации(службы IServiceCollection) { службы. AddControllersWithViews(); службы. Проверка подлинности(параметры => параметры. DefaultScheme = CookieAuthenticationDefaults. схема аутентификации); }

5. все еще получаю ту же ошибку

Ответ №1:

Вы прокомментировали, что при запуске контроллера у вас HttpClient client = new HttpClient(); есть новый экземпляр HttpClient

Таким образом, в вашей функции вы устанавливаете авторизацию объектов с помощью этой строки: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer " jsonData["accessToken"]); .

После этого вы получаете авторизацию пользователей от current HttpContext , которая отправляется каждый раз, когда пользователь посещает какую-либо ссылку, и она ничего не имеет общего с вашим client объектом, для которого вы просто установили авторизацию.

Поскольку вы перенаправляете, вы должны изменить текущий HttpContext заголовок авторизации, так как он будет перенесен в перенаправленный запрос. Сделайте это, изменившись HttpContext.Request.Headers["Authorization"] . Проблема в том, что этот запрос будет длиться только один раз, поэтому вам нужно вернуть токен клиенту, чтобы он отправлял его в заголовке каждый раз, когда делает запрос.

Комментарии:

1. Я понимаю, что вы хотите сказать..но я не понимаю, где мне нужно использовать этот HttpContext в моем методе входа в систему ИЛИ в методе после входа в систему