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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:45:02