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

Umbraco9 RC3对接IdentityServer4外部登录无法自动创建后台用户

问题原因及修复方案

你当前的配置存在3个核心错误,导致Umbraco的自动创建/关联账号逻辑无法触发:

  • 错误配置了SignInScheme:你使用了默认的Cookie认证Scheme,Umbraco后台外部登录必须使用专属的Scheme才能命中自带的外部账号处理流程
  • 错误配置了CallbackPath:你将回调地址设为根路径,外部登录完成后的回调请求无法进入Umbraco的外部登录处理中间件,自然不会执行自动关联逻辑
  • 缺少必要的声明映射配置:Umbraco需要通过sub声明识别外部用户的唯一标识,同时必须拿到有效的邮箱声明才能完成本地账号创建

修正后的完整配置

.AddBackOfficeExternalLogins(builder =>
    builder.AddBackOfficeLogin(
        build =>
            build.AddOpenIdConnect(
                build.SchemeForBackOffice(OpenIdConnectDefaults.AuthenticationScheme),
                "External login",
                options =>
                {
                    // 替换为Umbraco后台专属外部认证Scheme
                    options.SignInScheme = Constants.Security.BackOfficeExternalAuthenticationScheme;
                    options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;

                    options.RequireHttpsMetadata = false;
                    options.Authority = "https://localhost:3930";
                    options.MetadataAddress = "https://localhost:3930/.well-known/openid-configuration";
                    options.ClientSecret = "你的ClientSecret";
                    options.ClientId = "你的ClientId";
                    options.GetClaimsFromUserInfoEndpoint = true;
                    options.ResponseType = "code id_token";
                    // 替换为Umbraco预设的OIDC回调路径,不要自定义修改
                    options.CallbackPath = new PathString("/umbraco-signin-oidc");
                    options.RemoteSignOutPath = "/oidc-signout";
                    options.SignedOutRedirectUri = "你的登出跳转地址";

                    options.Scope.Clear();
                    options.Scope.Add("openid");
                    options.Scope.Add("profile");
                    options.Scope.Add("email");
                    options.SaveTokens = true;
                    options.UsePkce = true;

                    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                        NameClaimType = "name",
                        RoleClaimType = "role",
                        // 补充NameIdentifier声明映射,对应IdentityServer的sub声明
                        NameIdentifierClaimType = "sub",
                        // 确保邮箱声明映射正确
                        EmailClaimType = "email"
                    };

                    // 可选:如果IdentityServer返回的声明有前缀,可在这里添加映射去掉前缀,保证Umbraco能读到正确的字段
                    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub");
                    options.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
                    options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
                }
            ),
        options =>
            new BackOfficeExternalLoginProviderOptions(
                "btn-primary",
                "fa-windows",
                new ExternalSignInAutoLinkOptions(autoLinkExternalAccount: true, defaultUserGroups: new[] { Constants.Security.EditorGroupAlias }, defaultCulture: "en-US", allowManualLinking: true)
                {
                    OnAutoLinking = (user, loginInfo) =>
                    {
                        // 可在这里添加自定义字段赋值逻辑,比如用户昵称、自定义属性等
                    },
                    OnExternalLogin = (user, loginInfo) =>
                    {
                        // 可在这里添加登录校验逻辑,比如判断用户是否有权限登录后台
                        return true;
                    }
                },
                true,
                false,
                null)
    )
)

额外校验项

如果修改配置后仍无法自动创建账号,可检查以下内容:

  • 确认IdentityServer返回的IdToken和UserInfo接口中包含sub、email、name三个必填声明
  • 确认返回的邮箱地址没有被Umbraco中已有的其他账号占用
  • 可以在OnAutoLinking、OnExternalLogin方法中添加断点或日志,确认逻辑是否被触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:39:03