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

Umbraco 13外部会员提供者持久化认证Cookie问题

解决Umbraco会员自动跳转Entra ID登录及持久化认证Cookie问题

针对你遇到的Umbraco会员端无自动登录跳转、认证Cookie无法持久化的问题,以下是实际可行的解决方案:

一、自动重定向到Entra ID(无需手动点击登录按钮)

Umbraco后台用户的autoRedirect配置并未开放给会员端,可通过两种方式实现自动跳转:

1. 自定义未认证请求拦截中间件

在Program.cs中添加自定义中间件,拦截未认证的会员请求并直接触发Entra ID登录挑战:

app.Use(async (context, next) =>
{
    // 过滤后台请求及登录回调,避免循环跳转
    if (!context.User.Identity.IsAuthenticated 
        && !context.Request.Path.StartsWithSegments("/umbraco/backoffice")
        && context.Request.Path != "/umbraco/members/externallogincallback")
    {
        // 触发Entra ID外部登录,替换为你的提供者名称
        await context.ChallengeAsync("MicrosoftEntraID", new AuthenticationProperties
        {
            RedirectUri = context.Request.Path // 登录后返回原请求页面
        });
        return;
    }
    await next();
});

注意:此中间件需放在app.UseUmbraco()之前,确保优先执行拦截逻辑。

2. 配置会员认证自动挑战

修改会员认证配置,启用自动挑战并关联Entra ID提供者:

// 配置会员认证选项
builder.Services.Configure<MemberAuthenticationOptions>(options =>
{
    options.AuthenticationType = "UmbracoMembers";
    options.AutomaticChallenge = true;
});

// 配置Entra ID外部登录时启用自动跳转
builder.Services.AddUmbraco(builder.Environment, builder.Configuration)
    .AddBackOffice()
    .AddWebsite()
    .AddMembersExternalLogins(logins =>
    {
        logins.AddMicrosoftEntraID(options =>
        {
            // 填入你的Entra ID配置参数
            options.ClientId = builder.Configuration["AzureAd:ClientId"];
            options.ClientSecret = builder.Configuration["AzureAd:ClientSecret"];
            options.TenantId = builder.Configuration["AzureAd:TenantId"];
        });
    })
    .Build();

二、持久化会员认证Cookie(实现"记住我"功能)

你之前配置ConfigureApplicationCookie无效,是因为Umbraco会员使用独立的UmbracoMembers认证方案,需针对该方案配置Cookie:

1. 配置会员Cookie持久化属性

在Program.cs中添加针对UmbracoMembers方案的Cookie配置:

builder.Services.AddAuthentication()
    .AddCookie("UmbracoMembers", options =>
    {
        options.Cookie.Name = ".Umbraco.Members";
        // 设置Cookie有效期,示例为30天
        options.ExpireTimeSpan = TimeSpan.FromDays(30);
        // 启用滑动过期,每次活跃操作刷新有效期
        options.SlidingExpiration = true;
        // 强制设置Cookie为持久化
        options.Events.OnSigningIn = context =>
        {
            context.Properties.IsPersistent = true;
            context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(30);
            return Task.CompletedTask;
        };
    });

2. 外部登录时绑定持久化属性

在Entra ID外部登录的OnExternalLogin事件中,确保认证属性标记为持久化:

builder.Services.AddUmbraco(builder.Environment, builder.Configuration)
    .AddBackOffice()
    .AddWebsite()
    .AddMembersExternalLogins(logins =>
    {
        logins.AddMicrosoftEntraID(options =>
        {
            // 你的Entra ID配置...
            options.Events.OnExternalLogin = async context =>
            {
                // 此处处理会员查找/创建逻辑
                var member = await context.MemberManager.FindByLoginAsync(context.ExternalLoginInfo.LoginProvider, context.ExternalLoginInfo.ProviderKey);
                if (member == null)
                {
                    // 创建新会员的逻辑...
                }
                
                // 设置持久化认证属性
                context.AuthenticationProperties.IsPersistent = true;
                context.AuthenticationProperties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(30);
            };
        });
    })
    .Build();

关键注意点

  • 测试前清除浏览器旧会话Cookie,避免缓存干扰
  • 持久化Cookie有效期建议与Entra ID令牌有效期保持匹配,避免令牌过期后Cookie仍有效导致认证异常
  • 自动重定向逻辑需排除登录回调路径,防止出现无限循环跳转

内容的提问来源于stack exchange,提问作者Chris Disley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:45:58