新闻中心

Blazor AuthenticationStateProvider 使用教程

2025-12-15
浏览次数:
返回列表
AuthenticationStateProvider是Blazor中广播用户认证状态的核心服务,需继承并重写GetAuthenticationStateAsync(),调用NotifyAuthenticationStateChanged通知UI更新,注册为Scoped(Server)或Singleton(WASM),配合CascadingAuthenticationState使用。

blazor authenticationstateprovider 使用教程

Blazor 的 AuthenticationStateProvider 是实现自定义身份验证逻辑的核心组件,它负责向整个应用提供当前用户的认证状态(比如是否已登录、用户身份信息等)。默认情况下,Blazor Server 和 Blazor WebAssembly 的基础模板已集成 Identity 或 JWT 认证,但若需对接自有登录系统、Token 存储在 localStorage、或需要手动触发状态刷新,你就得自定义一个 AuthenticationStateProvider

理解 AuthenticationStateProvider 的作用

它不是“做登录”的工具,而是“广播登录状态”的服务。Blazor 组件(如 AuthorizeViewAuthorizeRouteView)会订阅它的状态变更,从而动态显示/隐藏内容或跳转路由。它内部维护一个 Task<authenticationstate></authenticationstate>,并通过 NotifyAuthenticationStateChanged 方法通知所有监听者状态已更新。

关键点:

  • 必须注册为 Scoped(Blazor Server)或 Singleton(Blazor WebAssembly),且早于 AuthenticationStateProvider 的消费者(如 CascadingAuthenticationState)注册
  • 重写 GetAuthenticationStateAsync() 返回当前状态(同步或异步获取用户信息)
  • 调用 NotifyAuthenticationStateChanged(Task<authenticationstate>)</authenticationstate> 才能触发 UI 更新

手写一个基于 localStorage 的 Provider(WebAssembly 场景)

适用于 JWT 登录后把 token 存在浏览器 localStorage,页面刷新后仍需恢复登录态的场景。

步骤如下:

  • 新建类继承 AuthenticationStateProvider,例如 CustomAuthStateProvider
  • 注入 IJSRuntime 用于读取 localStorage 中的 token
  • GetAuthenticationStateAsync() 中解析 token(可用 System.IdentityModel.Tokens.Jwt 解码,或简单检查是否存在)并构造 ClaimsPrincipal
  • 暴露一个 MarkUserAsAuthenticated(string token) 方法,保存 token 并通知状态变更
  • 暴露一个 Logout() 方法,清除 token 并通知未登录状态

注意:WebAssembly 中无法直接访问 HttpContext,所以不能依赖服务端 Session;token 过期校验建议在每次请求前由 HttpClient 拦截器处理,而非全靠 Provider。

触发状态更新的正确方式

别在登录成功后只改内部字段就完事——UI 不会响应。必须调用 NotifyAuthenticationStateChanged

芦笋演示 芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 237 查看详情 芦笋演示

常见错误写法:

❌ this._currentUser = new ClaimsPrincipal(identity); // 不会刷新 UI

正确做法:

  • 构造新的 AuthenticationState 实例(含新 ClaimsPrincipal
  • 调用 NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(principal)))
  • 如果操作是异步的(如从 API 获取用户信息),可直接返回该异步 Task

与路由和组件配合使用

确保 App.razor 中已包裹 CascadingAuthenticationState

<CascadingAuthenticationState>
  <Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
      <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
      <FocusOnN*igate RouteData="@routeData" Selector="h1" />
    </Found>
    <NotFound>
      <PageTitle>Not found</PageTitle>
      <LayoutView Layout="@typeof(MainLayout)">
        <p role="alert">Sorry, there's nothing at this address.</p>
      </LayoutView>
    </NotFound>
  </Router>
</CascadingAuthenticationState>

之后你就能在任意组件中使用:

  • <authorizeview>...</authorizeview> 根据角色/策略切换内容
  • @attribute [Authorize] 控制页面访问权限
  • @inject AuthenticationStateProvider AuthStateProvider 手动获取当前状态(不推荐频繁调用,优先用 AuthorizeView

基本上就这些。不复杂但容易忽略 Notify 通知和生命周期注册时机,踩坑多在这两处。

以上就是Blazor AuthenticationStateProvider 使用教程的详细内容,更多请关注其它相关文章!


# 你就  # 南京网站建设优化企业  # 网站推广热销易速达  # 鄂州农产品网站建设公司  # 网站建设要求有哪些内容  # 广西抖音推广营销公司  # 抖音seo推广教程  # 谷歌推广和seo 快速推广  # 长安区企业网站推广价钱  # 龙岗网站建设服务提供商  # 宁夏seo快排技巧  # 相关文章  # 适用于  # 如何在  # 在这  # js  # 序列化  # 操作指南  # 如何将  # 重写  # 自定义  # gate  # 路由  # ai  # session  # 工具  # app  # 浏览器  # cad  # go 


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


相关推荐: C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  微博网页版首页入口 微博电脑端官网登录链接  微信网页版官方快速登录入口 微信网页版网页版账号直达  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  AO3最新入口2025公告_AO3中文官网合集  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  c++ dfs和bfs代码 c++深度广度优先搜索算法  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  Steam官网入口直达 Steam注册及登录步骤  小米14应用无法联网原因分析_小米14网络权限修复  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Django表单验证失败时保留用户输入数据的最佳实践  zookeeper 都有哪些功能?  c++ 获取系统当前时间 c++时间戳获取方法  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  最新韩小圈网页版登录入口_官网在线观看官方链接  在Typer应用中优雅地处理和重组任意命令行参数  处理嵌套交互式控件:前端可访问性指南  在python-socketio事件处理器中安全访问Flask应用上下文  Go语言HTML解析:利用Goquery精准获取指定元素内容  马斯克:Optimus 人形机器人复数形式为 Optimi  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  新三国志曹操传110级星符试炼夏侯渊极难攻略  绝地鸭卫平a核爆刀流玩法攻略  如何将HTML表格多行数据保存到Google Sheets  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  Typer应用中灵活处理命令行参数的令牌化与解析  高德地图怎么看全景照片_高德地图全景照片浏览教程  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  C++如何生成随机数_C++ random库使用方法与范围设置  快手官方唯一登录入口 谨防山寨钓鱼网站  抖音创作助手登录入口_抖音创作辅助工具官网直达  Lar*el 递归关系中排除指定分支的教程  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  AO3同人作品网入口 AO3搜索引擎官网永久地址  外媒分析《GTA6》定价:卖100美元可以但真没必要!  提升Kafka消费者健壮性:会话超时处理与消息处理语义  J*aScript:在map操作中高效处理空数组  Win11怎么开启高性能模式_Windows 11电源计划优化设置  响应式容器内容自动缩放与宽高比维持教程  163邮箱注册官网 免费申请163个人邮箱  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明 

搜索