在同一Web应用程序中对ASP.NET Core 2 MVC和WebAPI进行身份验证

时间:2018-04-25 01:41:26

标签: asp.net-web-api asp.net-core asp.net-core-2.0

今天,我有一个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);
    }

0 个答案:

没有答案