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
相关产品推荐
相关产品推荐

