Blazor Server中如何携带身份认证调用内部API?
解决Blazor调用API时身份认证信息无法传递的问题
问题核心
Blazor的HttpClient不会自动携带登录后的认证令牌,导致API控制器无法通过GetUserAsync获取当前用户,即便你已在Blazor页面完成登录。
解决方案步骤
在Blazor页面注入认证状态服务
在你的Blazor页面代码顶部注入所需服务:@inject AuthenticationStateProvider AuthenticationStateProvider @inject HttpClient HttpClient获取认证令牌并附加到请求头
修改MyAction方法,先获取当前用户的认证令牌,再将其添加到HttpClient的请求头中:private async Task MyAction() { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var user = authState.User; if (user.Identity.IsAuthenticated) { // 获取访问令牌 var token = await AuthenticationStateProvider.GetTokenAsync("access_token"); // 添加Authorization头 HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); } var result = await HttpClient.DeleteAsync($"/api/mycontroller/delete/{someId}"); }注意:如果你的令牌类型不是Bearer,需对应修改认证头的方案名称;同时要确保Identity配置中已启用令牌发放逻辑。
确保API控制器启用授权
在API控制器或DoSomething方法上添加[Authorize]属性,确保只有认证用户能访问,这样User对象才会被正确填充:[Authorize] [HttpDelete("delete/{id}")] public async Task<IActionResult> DoSomething(int id) { var user = await userManager.GetUserAsync(User); // 后续业务逻辑 return Ok(); }验证认证方案配置
检查Startup/Program.cs中的认证配置,确保默认方案为Identity.Application:builder.Services.AddAuthentication(options => { options.DefaultScheme = IdentityConstants.ApplicationScheme; options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; }) .AddIdentityCookies();
为什么IHttpContextAccessor行不通?
Blazor WebAssembly运行在浏览器客户端,不存在服务器端的HttpContext,因此通过IHttpContextAccessor修改请求头完全无效。正确的做法是在客户端直接操作HttpClient的请求头,手动携带认证令牌。
内容的提问来源于stack exchange,提问作者Jordan772
相关产品推荐
相关产品推荐

