今天,我有一个ASP.NET Core 2 Web应用程序,它包含基于cookie的标准认证,用于带有剃刀视图的MVC前端,还有一个带有JWT的WebAPI,可以通过其他前端使用。
通过这个,同一个用户可以通过MVC剃刀网页和WebAPI调用登录,并访问每个人的受保护操作。这两部分工作正常,但彼此独立。
我现在要做的是扩展我的MVC前端部分以使用VueJS并在幕后调用我的WebAPI。
当用户通过MVC webapp登录时,ASP.NET Core 2中间件会创建cookie并向用户提供。但是,当我想通过VueJS向我的WebAPI发出请求时,我还需要一个JWT来传入标题。
我正在努力的部分是当用户通过MVC网页登录时除了cookie之外如何获得JWT。在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);
}