#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 в моем методе входа в систему ИЛИ в методе после входа в систему