ASPNETZERO: объединение публичного веб-сайта с проектом Web.Host - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть шаблон ASPNETZero (.Net Core & Angular).Первоначально там Angular и Host были разделены, и мне удалось вручную объединить их.Сейчас я пытаюсь объединить проект Public с проектом Web.Host, который думал, что это будет легко, а оказалось не так просто!

Я скопировал все компоненты (контроллеры, представления, ...) с общедоступного веб-сайта в проект Web.Host и установил необходимые параметры в файлах appSettings.json.Проект работает нормально, и моей целевой страницей является Домашняя страница на общедоступном веб-сайте.

Я изменил ссылку для входа в систему в заголовке Домашней страницы на:

<a href="@(string.Format("{0}{1}?ss={2}&returnUrl={3}", Model.AdminWebSiteRootAddress, "account/login", "true", Model.WebSiteRootAddress + "Account/SetLogin"))">@L("LogIn")</a>

Обратите внимание, что я изменил returnURL, который будет перенаправлен на действие SetLogin в контроллере учетной записи, которое является переименованной версией действия входа в систему, чтобы избежать бесконечного зацикливания.

public async Task<ActionResult> SetLogin(string accessToken, string userId, string tenantId = "", string returnUrl = "")
        {
            if (string.IsNullOrEmpty(accessToken) || string.IsNullOrEmpty(userId))
            {
                return await RedirectToExternalLoginPageAsync();
            }

            var targetTenantId = string.IsNullOrEmpty(tenantId) ? null : (int?)Convert.ToInt32(Base64Decode(tenantId));
            CurrentUnitOfWork.SetTenantId(targetTenantId);

            var targetUserId = Convert.ToInt64(Base64Decode(userId));

            var user = _userManager.GetUser(new UserIdentifier(targetTenantId, targetUserId));
            if (user == null)
            {
                return RedirectToAction("Index", "Home");
            }

            if (!user.SignInToken.Equals(accessToken) || !(user.SignInTokenExpireTimeUtc >= Clock.Now.ToUniversalTime()))
            {
                return RedirectToAction("Index", "Home");
            }

            CurrentUnitOfWork.SetTenantId(targetTenantId);
            //await _signInManager.SignInAsync(user, false);

            if (!string.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }

            var serverAddress = _webUrlService.GetServerRootAddress();
            return Redirect(serverAddress.EnsureEndsWith('/') + "app/main/jobs");
        }

Обратите внимание, что я прокомментировал await _signInManager.SignInAsync(user, false); так как я ожидаю, что пользователь уже вошел в систему при переходе к этому действию через компонент Angular login.Таким образом, на страницах общедоступного веб-сайта (Home, About) отображается, что пользователь не вошел в систему, и если я вручную изменил URL-адрес на угловой маршрут (localhost: // app / ....), пользователь, кажется, вошел в систему, и я могу просто выйти из системы.!

Однако, если у меня отключена отключенная линия, состояние входа пользователя выглядит правильно как на общедоступных, так и на угловых страницах, но функция выхода из системы в сообщении об ошибке на угловой странице выдает:

var tokenValidityKeyInClaims = User.Claims.First(c => c.Type == AppConsts.TokenValidityKey);

Так как await _signInManager.SignInAsync(user, false); в действии SetLogin перезаписывает значения утверждений.

Ошибка:

System.InvalidOperationException: В последовательности отсутствует соответствующий элемент в System.Linq.Enumerable.First [TSource] (предикат IEnumerable 1 source, Func 2) в AgbizCareers.Web.Controllers.TokenAuthController.LogOut () в C: \ Projects \ AgbizCareers \ Branches \ Development \ src\ AgbizCareers.Web.Core \ Controllers \ TokenAuthController.cs: строка 180 в lambda_method (Closure, Object) в Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableResultExecutor.Execute (аргументы объекта IActionResultType, объекта-исполнителя, исполнителя объекта Objectecutor) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync () в микрофонеrosoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker., Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync ()

*общедоступный веб-сайт в проекте Web.Host?
...