У меня есть шаблон 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?