Umbraco 13外部会员提供者持久化认证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
相关产品推荐
相关产品推荐

