ASP.NET Core 8 Blazor:将Keycloak用户属性cegnev存入应用数据库
实现Keycloak自定义属性cegnev同步到ASP.NET Core Blazor应用数据库
要将Keycloak中的自定义属性cegnev保存到应用数据库的ApplicationUser中,需完成以下步骤:
1. 确保Keycloak正确返回cegnev属性
- 在Keycloak控制台的目标客户端配置中,进入Client Scopes:
- 若使用自定义Scope,需将
cegnev属性关联到该Scope,并设置为"Add to ID token"或"Add to userinfo"; - 若使用默认
profileScope,可在Scope的Mappers中添加属性映射,将用户属性cegnev映射为对应Claim。
- 若使用自定义Scope,需将
2. 配置OpenIdConnect的Claim映射
在Program.cs的Keycloak OpenIdConnect配置中,添加Claim映射规则,确保Keycloak返回的cegnev Claim能被应用正确识别:
.AddOpenIdConnect("Keycloak", "CorpAuth", options => { // 原有配置... options.Scope.Add("cegnev"); // 映射cegnev Claim(若Keycloak返回的Claim带命名空间,需替换为实际Claim名称) options.ClaimActions.MapUniqueJsonKey("cegnev", "cegnev"); // 示例:若Keycloak返回命名空间形式的Claim,如"https://your-domain/claims/cegnev" // options.ClaimActions.MapUniqueJsonKey("cegnev", "https://your-domain/claims/cegnev"); // 原有配置... });
3. 同步Claim到ApplicationUser属性
方法一:首次登录时创建用户同步属性
修改默认Identity模板中的ExternalLogin.razor.cs文件,在创建本地用户时从外部Claim提取cegnev并赋值:
public async Task<IActionResult> OnPostConfirmationAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); } var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email }; // 从外部Principal中获取cegnev Claim var cegnevClaim = info.Principal.FindFirst("cegnev"); if (cegnevClaim != null) { user.cegnev = cegnevClaim.Value; } var result = await _userManager.CreateAsync(user); if (result.Succeeded) { result = await _userManager.AddLoginAsync(user, info); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false, info.LoginProvider); return LocalRedirect(returnUrl); } } // 错误处理逻辑... }
方法二:每次登录时同步属性(保持数据最新)
在Program.cs的Keycloak OpenIdConnect配置中添加OnTokenValidated事件,每次登录验证Token后更新用户的cegnev属性:
.AddOpenIdConnect("Keycloak", "CorpAuth", options => { // 原有配置... options.Events = new OpenIdConnectEvents { OnTokenValidated = async context => { var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<ApplicationUser>>(); var currentUser = await userManager.GetUserAsync(context.Principal); if (currentUser != null) { var cegnevClaim = context.Principal.FindFirst("cegnev"); if (cegnevClaim != null && currentUser.cegnev != cegnevClaim.Value) { currentUser.cegnev = cegnevClaim.Value; await userManager.UpdateAsync(currentUser); } } } }; });
4. 更新数据库结构
由于ApplicationUser新增了cegnev属性,需创建并执行数据库迁移:
# 创建迁移 Add-Migration AddCegnevToApplicationUser # 应用迁移到数据库 Update-Database
内容的提问来源于stack exchange,提问作者Indoraptor
相关产品推荐
相关产品推荐

