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

OrchardCore问题:发布后个人资料菜单无法切换显示

问题解决:发布后认证状态变更时菜单不切换

问题分析

调试模式下菜单能根据User.Identity.IsAuthenticated正常切换,但发布后该值不随认证状态更新,核心原因通常是缓存机制导致视图未重新渲染,或是认证状态检测逻辑不够可靠。

解决方案

1. 替换更可靠的认证状态检测方式

直接使用SignInManager的IsSignedInAsync方法替代User.Identity.IsAuthenticated,该方法会实时检查当前会话的认证状态,避免依赖可能被缓存的Identity对象:

修改视图中的判断逻辑:

@if (await SignInManager.IsSignedInAsync(User))
{
    // 已认证菜单内容
}
else
{
    // 未认证登录入口
}

2. 禁用菜单视图的缓存

如果菜单所在的视图或布局被缓存,会导致认证状态变更后视图仍显示旧内容。在Orchard Core中,可通过以下方式禁用缓存:

  • 在视图顶部添加@attribute [NoCache]特性,强制视图不被缓存:
    @attribute [NoCache]
    
  • 若菜单是作为组件渲染,确保组件没有配置缓存策略,或缓存策略包含用户身份作为依赖项。

3. 检查认证Cookie配置

发布环境中Cookie配置不当可能导致认证状态无法正确更新,需确保:

  • 在Orchard Core的认证设置中,Cookie的Secure属性在HTTPS环境下设为true,避免Cookie无法跨请求传递;
  • 确认SameSite属性设置为Lax或None(根据业务场景),防止跨域或跨请求时Cookie失效;
  • 登录/登出操作后执行完整页面刷新,避免AJAX请求导致页面未重新加载认证状态。

4. 优化视图数据加载逻辑

原视图中多次调用SiteService.GetSiteSettingsAsync()会重复查询站点设置,可合并为一次调用提升性能,同时避免缓存影响:

@{ 
    var siteSettings = await SiteService.GetSiteSettingsAsync();
    var allowChangeEmail = siteSettings.As<ChangeEmailSettings>().AllowChangeEmail;
    var userCanRegister = siteSettings.As<RegistrationSettings>().UsersCanRegister == UserRegistrationType.AllowRegistration;
    var externalAuthenticationSchemes = (await SignInManager.GetExternalAuthenticationSchemesAsync()).ToList();
}

完整修改后的Menu.cshtml示例

@using Microsoft.AspNetCore.Identity
@using Microsoft.Extensions.Options
@using OrchardCore.Admin
@using OrchardCore.Entities
@using OrchardCore.Settings
@using OrchardCore.Users
@using OrchardCore.Users.Models
@inject ISiteService SiteService
@inject SignInManager<IUser> SignInManager
@inject IOptions<AdminOptions> AdminOptions
@using OrchardCore.DisplayManagement.Razor
@inherits OrchardCore.DisplayManagement.Razor.RazorPage<TModel>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@attribute [NoCache]

@{ 
    var siteSettings = await SiteService.GetSiteSettingsAsync();
    var allowChangeEmail = siteSettings.As<ChangeEmailSettings>().AllowChangeEmail;
    var externalAuthenticationSchemes = (await SignInManager.GetExternalAuthenticationSchemesAsync()).ToList();
    var userCanRegister = siteSettings.As<RegistrationSettings>().UsersCanRegister == UserRegistrationType.AllowRegistration;
}

<ul class="navbar-nav">
    @if (await SignInManager.IsSignedInAsync(User))
    {
        <li class="nav-item dropdown">
            <a href="#" class="nav-link px-2 px-lg-3 rounded js-scroll-trigger dropdown-toggle" data-bs-toggle="dropdown">
                @User.Identity.Name <b class="caret"></b>
            </a>
            <div class="dropdown-menu">
                <a class="dropdown-item bottom-line-hover" asp-route-area="OrchardCore.Admin" asp-controller="Admin" asp-action="Index">
                    <i class="fas fa-desktop fa-fw mx-1"></i>Dashboard
                </a>
                @if (allowChangeEmail)
                {
                    <a class="dropdown-item bottom-line-hover" asp-route-area="OrchardCore.Users" asp-controller="ChangeEmail" asp-action="Index">
                        <i class="fas fa-envelope fa-fw mx-1"></i>Change Email
                    </a>
                }

                <a class="dropdown-item bottom-line-hover" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="ChangePassword">
                    <i class="fas fa-lock fa-fw mx-1"></i>Change Password
                </a>

                @if (externalAuthenticationSchemes.Count() > 0)
                {
                    <a class="dropdown-item bottom-line-hover" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="ExternalLogins">
                        <i class="fas fa-user-lock fa-fw mx-1"></i>External Logins
                    </a>
                }
                <form class="form-inline" asp-route-area="OrchardCore.Users" method="post" asp-controller="Account" asp-action="LogOff">
                    <button type="submit" class="dropdown-item bottom-line-hover">
                        <i class="button-text-color fas fa-sign-out-alt fa-fw mx-1"></i>Log out
                    </button>
                </form>
            </div>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link px-2 px-lg-3 rounded js-scroll-trigger" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="Login">
                <i class="fas fa-sign-in-alt"></i>
            </a>
        </li>
    }
</ul>

内容的提问来源于stack exchange,提问作者Syed Muhammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:32