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

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";
    • 若使用默认profile Scope,可在Scope的Mappers中添加属性映射,将用户属性cegnev映射为对应Claim。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:39:50