我有一个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更改为重定向到Account控制器中的SetLogin操作,这是Login操作的重命名版本,以避免无限循环。
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登录组件执行此操作时用户已经登录。这样,公共网站页面(“主页”,“关于”)会向用户显示未登录,并且如果我手动将URL更改为角度路由(localhost:// app / ....),则用户似乎已登录,我可以简单地注销!
但是,如果我启用了禁用的行,则用户登录状态在公共页面和角度页面上都看起来正确,但是角度页面上的注销功能会在以下地方抛出错误:
var tokenValidityKeyInClaims = User.Claims.First(c => c.Type == AppConsts.TokenValidityKey);
SetLogin操作中的await _signInManager.SignInAsync(user, false);
似乎覆盖了Claims值。
错误:
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:line 180 at lambda_method(Closure,Object)在 Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor执行器,对象控制器,Object [] 争论) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& 接下来,范围和作用域,对象和状态,布尔值和isCompleted)位于 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()
是否有任何文档来说明如何将公共网站合并到Web.Host项目中?