如何在Blazor Server应用中注入ClaimsPrincipal并正确获取用户身份
解决方案
Blazor官方推荐使用AuthenticationStateProvider服务获取认证用户信息,该服务同时兼容MVC和Blazor场景,无需依赖IHttpContextAccessor,具体改造步骤如下:
1. 重构业务服务
调整UserContext与WrapperService实现,替换用户信息来源:
public class UserContext { private readonly AuthenticationStateProvider _authStateProvider; public UserContext(AuthenticationStateProvider authStateProvider) { _authStateProvider = authStateProvider; } // 异步获取认证状态,也可扩展返回所有用户声明 public async Task<bool> GetIsAuthenticatedAsync() { var authState = await _authStateProvider.GetAuthenticationStateAsync(); return authState.User.Identity?.IsAuthenticated ?? false; } // 兼容原有同步调用的可选方案:提前缓存用户信息 public ClaimsPrincipal CachedUser { get; set; } public bool IsAuthenticated => CachedUser?.Identity?.IsAuthenticated ?? false; } public class WrapperService { private readonly UserContext _userContext; public WrapperService(UserContext context) => _userContext = context; public async Task<bool> UserHasSpecialAccessAsync() { return await _userContext.GetIsAuthenticatedAsync(); // 若用缓存方案可直接写为 return _userContext.IsAuthenticated; } }
2. 调整依赖注入配置
删除原有ClaimsPrincipal的Scoped注册,保留以下配置即可:
// AuthenticationStateProvider为Blazor默认注册服务,无需手动添加 services.AddScoped<UserContext>(); services.AddScoped<WrapperService>(); // 若需要兼容原有MVC逻辑,可保留IHttpContextAccessor注册,在MVC过滤器中提前给UserContext.CachedUser赋值 services.AddHttpContextAccessor();
3. Blazor组件适配
如果使用缓存方案避免修改原有同步调用逻辑,只需在Blazor页面初始化阶段提前缓存当前用户:
@inject WrapperService _Wrapper @inject AuthenticationStateProvider _authStateProvider @inject UserContext _userContext <button @onclick="HandleClick">Check Access</button> @code { protected override async Task OnInitializedAsync() { // 页面初始化时可正常获取到认证信息,缓存后后续交互直接使用 var authState = await _authStateProvider.GetAuthenticationStateAsync(); _userContext.CachedUser = authState.User; } async Task HandleClick() { // 异步方案调用 var hasPermission = await _Wrapper.UserHasSpecialAccessAsync(); // 缓存方案可直接使用原有同步调用:var hasPermission = _Wrapper.UserHasSpecialAccess(); } }
内容的提问来源于stack exchange,提问作者Darren Neimke
相关产品推荐
相关产品推荐

