新闻中心

Blazor 怎么给 HTTP 请求添加认证头

2025-12-13
浏览次数:
返回列表
Blazor中HTTP认证头配置核心是按场景选择方式:WASM推荐用DelegatingHandler动态注入Bearer Token,Server端通常无需前端加头。

blazor 怎么给 http 请求添加认证头

在 Blazor 中给 HTTP 请求添加认证头,核心是配置 HttpClient 实例,使其自动携带如 Authorization: Bearer xxx 这样的请求头。具体方式取决于你用的是 Blazor WebAssembly(WASM)还是 Blazor Server,但主流和推荐做法集中在 WASM 场景——因为 Server 端通常走服务端身份验证(如 Cookie 或 JWT 在服务端验证),前端无需手动加头。

Blazor WebAssembly:用自定义 DelegatingHandler 注入认证头

这是最灵活、推荐的方式,尤其适合使用 JWT 的场景。你创建一个继承自 DelegatingHandler 的类,在 SendAsync 中读取当前用户 Token 并添加到请求头中。

  • 先确保已通过 AuthenticationStateProvider 获取登录状态和 Token(比如从本地存储或 IdentityServer 登录后缓存)
  • 新建一个 AuthHeaderHandler.cs
public class AuthHeaderHandler : DelegatingHandler
{
    private readonly N*igationManager _n*igation;
    private readonly IJSRuntime _jsRuntime;

    public AuthHeaderHandler(N*igationManager n*igation, IJSRuntime jsRuntime)
    {
        _n*igation = n*igation;
        _jsRuntime = jsRuntime;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var token = await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "authToken");
        if (!string.IsNullOrWhiteSpace(token))
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }

        return await base.SendAsync(request, cancellationToken);
    }
}
  • Program.cs(或 Startup.cs)中注册该 handler,并配置命名的 HttpClient
builder.Services.AddTransient<AuthHeaderHandler>();
builder.Services.AddHttpClient("AuthenticatedClient", client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
})
.ConfigurePrimaryHttpMessageHandler(() => new AuthHeaderHandler(
    builder.Services.GetRequiredService<N*igationManager>(),
    builder.Services.GetRequiredService<IJSRuntime>()));
  • 在组件中注入并使用:
@inject IHttpClientFactory HttpClientFactory

@code {
    private async Task LoadData()
    {
        var client = HttpClientFactory.CreateClient("AuthenticatedClient");
        var response = await client.GetAsync("api/values");
        // ...
    }
}

Blazor WebAssembly:直接设置 HttpClient.DefaultRequestHeaders(简单但不推荐)

适用于 Token 固定、且整个应用生命周期内不会变更的极简场景(比如测试用)。它会污染全局默认头,不适合多用户或 Token 动态刷新的场景。

  • Program.cs 初始化时设置:
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", "your-jwt-token-here");
  • 然后注册为单例:
builder.Services.AddSingleton(sp => httpClient);

注意:这种方式无法动态更新 Token,也不支持异步获取(比如从 JS 或 AuthState 获取),仅作快速验证用。

配合 AuthenticationStateProvider 动态刷新 Token

真实项目中 Token 可能过期或需要刷新。你需要让 AuthHeaderHandler 能响应认证状态变化。

OpenAI Codex OpenAI Codex

可以生成十多种编程语言的工作代码,基于 OpenAI GPT-3 的自然语言处理模型

OpenAI Codex 144 查看详情 OpenAI Codex
  • AuthHeaderHandler 中注入 AuthenticationStateProvider
  • 调用 GetAuthenticationStateAsync() 获取当前用户,并从中提取 Token(例如从 User.FindFirst("token")?.Value
  • 如果使用 Microsoft.AspNetCore.Components.WebAssembly.Authentication 包(如 RemoteAuthenticationState),Token 通常已封装在 user.Identity 或自定义声明中

这样每次发请求前都会拉取最新认证状态,天然支持登录/登出/Token 刷新后的自动同步。

Blazor Server:一般不需要前端加认证头

Blazor Server 是服务端渲染,HTTP 请求由服务器发出(比如用 HttpClient 调后端 API),此时认证通常靠服务端 Cookie 或服务间 Token,前端组件本身不发跨域请求。若需调用外部 API,应在服务端完成认证(如用 IHttpClientFactory + AddHttpMessageHandler),而非在 Razor 组件里操作请求头。

如果你在 Blazor Server 中用了 JSInterop 发起浏览器原生 fetch,则可按 JS 方式加头(如 headers: { 'Authorization': 'Bearer ...' }),但这属于前端 JS 行为,不属于 Blazor 的 .NET HTTP 生态。

基本上就这些。关键是选对模式:WASM 推荐 DelegatingHandler + AuthenticationStateProvider;Server 场景尽量避免前端发带认证的请求;所有 Token 存储与读取都要注意安全性(避免 XSS 泄露 localStorage)。

以上就是Blazor 怎么给 HTTP 请求添加认证头的详细内容,更多请关注其它相关文章!


# 前端  # 操作指南  # 如何将  # 发带  # 自定义  # 服务端  # red  # .net  # microsoft  # ai  # 后端  # 浏览器  # cookie  # js  # 跨域  # 沈阳低价网站推广平台  # 吴中网站优化电话  # 网站权重提升推广平台  # 广元网站建设找哪家  # 网站建设定制售价  # 360网站如何优化  # seo小说站群  # 上城企业网站优化公司  # 沧州网站建设选修课  # 神农架做网站推广  # 也不  # 这是  # 的是  # 如用 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何优雅处理error_Golang error处理最佳实践总结  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  学习通网页版官方登录 超星学习通电脑端入口指南  Animex动漫社网入口地址 Animex动漫社网正版在线入口  多闪网页版在线观看免费入口_多闪官网访问入口  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  Discord Slash 命令响应超时问题的异步解决方案  必由学官网首页入口 必由学教师网页版登录指南  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  J*a 递归快速排序中静态变量的状态管理与陷阱  J*a实现学校排课程序_面向对象结构化项目示例  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  Win10双系统截图高效法 截屏快捷键速记【技巧】  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Mac怎么锁定备忘录_Mac备忘录加密设置教程  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  Golang如何使用new_Go new分配内存机制讲解  AO3官方可用镜像 Archive of Our Own网页版最新入口  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  b站赚钱渠道_b站收益来源  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  126邮箱账号注册 电脑版登录入口  微信语音通话掉线如何解决 微信语音通话稳定优化方法  Python实时数据流中的动态最值查找策略  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  基于动态规划的房屋花卉种植最小成本算法详解  steam官方网页快速访问 steam账号注册全流程  React中useState与局部变量:理解组件状态管理与渲染机制  批改网学生版PC登录 批改网官网登录系统入口  html5 app怎么运行环境_配html5 app运行环境【教程】  Golang指针如何与map组合使用_Golang map指针组合实践  小红书网页版入口链接分享 小红书官网直接进  12306选座怎么选到临时改签座_12306改签选座策略与步骤  Win11怎么开启高性能模式_Windows 11电源计划优化设置  Node.js中HTML按钮与J*aScript函数交互的正确姿势  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  J*a中实现Go语言select通道多路复用机制  微信聊天记录怎么加密_微信聊天记录加密方法  mc.js官网登录入口 mc.js官方登录入口最新版  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  照顾宝贝2小游戏免费秒玩入口 

搜索