Аутентификация для ASP.NET Core 2 MVC и WebAPI в одном веб-приложении - PullRequest
0 голосов
/ 25 апреля 2018

Сегодня у меня есть веб-приложение 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);
    }
...