Сегодня у меня есть веб-приложение ASP.NET Core 2, которое содержит стандартную проверку подлинности на основе файлов cookie для использования с внешним интерфейсом MVC с бритвенными представлениями, а также WebAPI с JWT для использования через другие внешние интерфейсы.
При этом один и тот же пользователь может войти в систему через веб-страницу бритвы MVC и через вызов WebAPI и получить доступ к защищенным действиям для каждого из них.Эти две части работают нормально, но независимо друг от друга.
Теперь я хотел бы расширить части моего внешнего интерфейса MVC для использования VueJS и вызывать мой WebAPI за кулисами.
Когда пользователь входит в систему через веб-приложение MVC, промежуточное программное обеспечение ASP.NET Core 2 создает файл cookie и возвращает его обратно пользователю.Но когда я хочу делать запросы через VueJS в мой WebAPI, мне также нужно иметь JWT для передачи в заголовке.
Часть, с которой я борюсь, это как получить JWT, когда пользователь входит черезвеб-страница MVC в дополнение к cookie.В действии входа в MVC я, конечно, могу сгенерировать JWT, но как мне вернуть его пользователю и сохранить в localStorage?
Вот мое текущее действие входа в мой контроллер MVC (очень похоже нашаблон):
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
var userToVerify = await _userManager.FindByEmailAsync(model.Email);
var identity = await Task.FromResult(_jwtFactory.GenerateClaimsIdentity(model.Email, userToVerify.Id));
// At this point 'jwt' contains the complete token object I would need to store in localStorage
var jwt = await Tokens.GenerateJwt(identity, _jwtFactory, model.Email, _jwtOptions, new JsonSerializerSettings { Formatting = Formatting.Indented });
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}