You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成Okta后Kentico 13页面预览模式报错问题排查

Kentico 13 CMS预览模式集成Okta SSO后出现InvalidVirtualContextException错误

错误详情

运行Kentico 13预览模式时触发以下异常:

An unhandled exception has occurred while executing the request.
Message: Try reloading the administration interface. The user was not found in the JWT token, nor in the current virtual context URL.

Exception type: CMS.Helpers.InvalidVirtualContextException
Stack trace:
at Kentico.Content.Web.Mvc.VirtualContextPrincipalRetriever.GetPrincipal(String jwtToken)
at Kentico.Content.Web.Mvc.VirtualContextRequestPrincipalRetriever.Retrieve(HttpRequest request)
at Kentico.Web.Mvc.AuthenticationHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at IMPlus.Web.UI.Middleware.CultureMiddleware.<>c__DisplayClass3_0.<g__invokeImplementation|0>d.MoveNext() in C:\Users\inraja03\source\repos\IM Plus\BackEnd\IMPlus.Web.UI\Middleware\CultureMiddleware.cs:line 45
--- End of stack trace from previous location ---
at IMPlus.Web.UI.Middleware.CultureMiddleware.InvokeAsync(HttpContext httpContext) in C:\Users\inraja03\source\repos\IM Plus\BackEnd\IMPlus.Web.UI\Middleware\CultureMiddleware.cs:line 28
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Kentico.Content.Web.Mvc.ContentOutputMiddleware.InvokeAsync(HttpContext context)
at Kentico.Web.Mvc.KenticoRequestLocalizationMiddleware.InvokeAsync(HttpContext context)
at Kentico.Content.Web.Mvc.PageRedirectionContextMiddleware.InvokeAsync(HttpContext context)
at Kentico.Web.Mvc.KenticoRequestEventsMiddleware.InvokeAsync(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

问题观察

  • 集成Okta SSO认证后触发错误,禁用Okta后预览模式恢复正常
  • 仅UAT和生产环境出现问题,开发环境无异常;管理站点与生产站点映射在同一域名下

解决方案

1. 调整认证中间件执行顺序

Kentico预览模式依赖自身的JWT令牌进行用户身份识别,若Okta认证中间件先于Kentico认证中间件执行,会拦截预览请求并覆盖身份验证流程。需确保Kentico认证中间件优先加载:

// 在Startup.cs的Configure方法中
app.UseKenticoAuthentication();
// 随后添加Okta认证中间件
app.UseOktaAuthentication(new OktaMvcOptions
{
    // Okta配置参数
});

2. 配置Okta认证忽略预览路由

让Okta跳过预览模式相关路径的身份验证,允许Kentico自行处理这些请求:

方式一:通过OpenIdConnectEvents排除路径

options.Events = new OpenIdConnectEvents
{
    OnRedirectToIdentityProvider = context =>
    {
        // 替换为实际的预览路由前缀,如/preview或包含virtualcontext的路径
        if (context.Request.Path.StartsWithSegments("/preview"))
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            context.HandleResponse();
        }
        return Task.CompletedTask;
    }
};

方式二:使用MapWhen隔离认证逻辑

// 仅对非预览路径应用Okta认证
app.MapWhen(context => !context.Request.Path.StartsWithSegments("/preview"), appBuilder =>
{
    appBuilder.UseOktaAuthentication(new OktaMvcOptions { ... });
});
// 全局应用Kentico认证
app.UseKenticoAuthentication();

3. 验证虚拟上下文JWT配置一致性

检查UAT/生产环境与开发环境的Kentico虚拟上下文JWT配置是否一致,重点确认:

  • JWT签名密钥(CMSVirtualContextAuthenticationOptions中的TokenValidationParameters)
  • 令牌受众(Audience)和发行方(Issuer)设置
  • 令牌有效期配置

环境间的配置差异可能导致Kentico无法正确解析预览请求中的JWT令牌。

4. 排查同域名Cookie冲突

管理站点与生产站点同域名时,Okta的认证Cookie可能与Kentico预览模式的Cookie产生冲突。可通过以下方式解决:

  • 为Okta认证配置独立的Cookie路径(如/admin)
  • 调整Kentico预览Cookie的域或路径设置,避免与Okta Cookie重叠

问题根源分析

开发环境无异常通常是因为:

  • 开发环境未启用严格的Okta认证策略
  • 开发环境中管理站点与生产站点使用不同域名,无Cookie冲突
  • 开发环境的认证中间件顺序配置正确

内容的提问来源于stack exchange,提问作者Arjun Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:15:01