ASPNETZERO:将公共网站合并到Web.Host项目

时间:2019-02-13 03:08:18

标签: aspnetboilerplate

我有一个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项目中?

0 个答案:

没有答案