Blazor Server应用中登录后在C#类获取AD B2C用户Claims并保存至数据库的实现方法
嗨,针对你的问题,我来分享一下在Blazor Server的非Razor类里获取Azure AD B2C用户Claims并保存到数据库的可行方案——两种方法各有适用场景,你可以按需选择:
方法1:通过IHttpContextAccessor获取(适合请求上下文内的场景)
这种方法适合在用户触发的操作(比如按钮点击调用服务)这类有明确请求上下文的场景下使用:
- 第一步,在
Program.cs中注册HttpContextAccessor服务:
builder.Services.AddHttpContextAccessor();
- 第二步,在你的C#类中注入
IHttpContextAccessor,即可访问用户Claims:
public class UserClaimSaver { private readonly IHttpContextAccessor _httpContextAccessor; private readonly YourDbContext _dbContext; // 构造函数注入依赖 public UserClaimSaver(IHttpContextAccessor httpContextAccessor, YourDbContext dbContext) { _httpContextAccessor = httpContextAccessor; _dbContext = dbContext; } public async Task SaveClaimsToDb() { var httpContext = _httpContextAccessor.HttpContext; // 先判断用户是否已认证 if (httpContext?.User?.Identity?.IsAuthenticated == true) { // 获取用户所有Claims var claims = httpContext.User.Claims; // 转换为数据库实体(假设你有对应的UserClaim实体类) var dbClaims = claims.Select(c => new UserClaim { UserId = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value, ClaimType = c.Type, ClaimValue = c.Value }).ToList(); // 保存到数据库 _dbContext.UserClaims.AddRange(dbClaims); await _dbContext.SaveChangesAsync(); } } }
- 注意:如果你的类是后台服务、定时任务这类脱离请求上下文的场景,
HttpContext可能返回null,这种情况下不推荐用这个方法。
方法2:通过AuthenticationStateProvider获取(Blazor官方推荐,通用场景)
Blazor Server的身份认证状态由AuthenticationStateProvider统一管理,这是更可靠的通用方案,无论是否在请求上下文内都能正确获取当前用户的认证状态:
- 直接在你的C#类中注入
AuthenticationStateProvider(Blazor Server默认已注册该服务,无需额外配置):
public class UserClaimSaver { private readonly AuthenticationStateProvider _authStateProvider; private readonly YourDbContext _dbContext; public UserClaimSaver(AuthenticationStateProvider authStateProvider, YourDbContext dbContext) { _authStateProvider = authStateProvider; _dbContext = dbContext; } public async Task SaveClaimsToDb() { // 获取当前用户的认证状态 var authState = await _authStateProvider.GetAuthenticationStateAsync(); var user = authState.User; if (user.Identity.IsAuthenticated) { var userId = user.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userId)) { // 处理找不到用户唯一ID的异常情况 return; } var dbClaims = user.Claims.Select(c => new UserClaim { UserId = userId, ClaimType = c.Type, ClaimValue = c.Value }).ToList(); _dbContext.UserClaims.AddRange(dbClaims); await _dbContext.SaveChangesAsync(); } } }
- 优势:这是Blazor官方推荐的身份状态获取方式,能正确处理SignalR连接的身份信息,即使在后台逻辑中也能拿到当前登录用户的Claims。
额外注意事项
- 确保Azure AD B2C的认证配置正确,用户登录后
User.Identity.IsAuthenticated会返回true。 - Azure AD B2C返回的
NameIdentifierClaim是用户的唯一标识,用来关联数据库中的用户记录最适合。 - 保存Claims时建议添加去重逻辑,避免重复插入相同的Claim记录。
内容的提问来源于stack exchange,提问作者wonderful world
相关产品推荐
相关产品推荐

