当前位置: 首页 > news >正文

Blazor静态服务端呈现(静态SSR)身份认证

本文介绍 Blazor 静态服务端呈现(静态 SSR)模式下,用户登录身份认证是如何实现的。

1. SSR 简介

SSR 是服务器侧呈现,HTML 是由服务器上的 ASP.NET Core 运行时生成,通过网络发送到客户端,供客户端的浏览器显示。SSR 分两种类型:

  • 静态 SSR:服务器生成静态 HTML,它不提供用户交互性或维护 Razor 组件状态,通过 HTTP 协议进行通信。
  • 交互式 SSR:Blazor 事件允许用户交互,并且 Razor 组件状态由 Blazor 框架维护,通过 SignalR 连接使用 WebSocket 协议进行通信。

2. 为什么用静态 SSR

由于交互式 SSR 存在断线重连的问题,影响用户体验,所以采用静态 SSR 组件呈现服务端内容,为了增加前端交互体验,采用 JavaScript 作为前端交互。

3. 实现思路

  • 在 App.razor 文件中使用级联参数的 HttpContext 对象获取用户是否登录
  • 将用户登录信息传递给路由组件的级联 Context 对象,
  • 在所有子组件中,使用级联参数的 Context 对象获取用户信息
  • 使用 HttpContext.SignInAsync 和 HttpContext.SignOutAsync 实现登录和注销

4. 实现步骤

  • 创建 UserInfo 和 Context 类
public class UserInfo
{public string UserName { get; set; }
}public class Context
{public UserInfo CurrentUser { get; set; }
}
  • 创建 App.razor 文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8" />
</head>
<body><Routes User="user" />
</body>
</html>@code {[CascadingParameter] private HttpContext HttpContext { get; set; }private UserInfo user;protected override void OnInitialized(){base.OnInitialized();if (HttpContext.User.Identity.IsAuthenticated)user = new UserInfo { UserName = HttpContext.User.Identity.Name };elseuser = null;}
}
  • 创建 Route.razor 文件
<CascadingValue Value="context" IsFixed><Router AppAssembly="typeof(Program).Assembly"><Found Context="routeData"><RouteView RouteData="routeData" /></Found><NotFound></NotFound></Router>
</CascadingValue>@code {private UIContext context;[Parameter] public UserInfo User { get; set; }protected override void OnInitialized(){context = new Context();context.CurrentUser = User;base.OnInitialized();}
}
  • 创建 LoginBox.razor 文件
@if (Context.CurrentUser == null)
{<span onclick="login()">登录</span><script>function login() { fetch('/signin').then(res => location.reload()); }</script>
}
else
{<span onclick="logout()">退出</span><script>function logout() { fetch('/signout').then(res => location.reload()); }</script>
}@code {[CascadingParameter] private Context Context { get; set; }
}
  • 创建 AuthController.cs 文件
public class AuthController : ControllerBase
{private const string AuthType = "App_Cookie";[Route("signin")]public async Task Login([FromBody] UserInfo info){var claims = new List<Claim>() { new(ClaimTypes.Name, info.UserName) };var identity = new ClaimsIdentity(claims, AuthType);var principal = new ClaimsPrincipal(identity);await HttpContext.SignInAsync(AuthType, principal);}[Route("signout")]public async Task Logout(){await HttpContext.SignOutAsync(AuthType);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Python笔记】PyCharm大模型项目环境配置
  • Qt 定时器-定时备份
  • 微信小程序中实现类似于 ECharts 的图表渲染及优化
  • 家电制造的隐形守护者:矫平机确保材料完美无瑕
  • gin基本使用
  • 探索Python的Excel世界:openpyxl的魔法之旅
  • 51单片机应用开发---数码管的控制应用
  • ERP进销存管理系统的业务全流程 Axure高保真原型源文件分享
  • springBoot整合easyexcel实现导入、导出功能
  • 递归10小题
  • 一篇文章,讲清SQL的 joins 语法
  • 架构设计——概念和基础
  • RabbitMQ(高阶使用)死信队列
  • 【机器学习】9 ——最大熵模型的直观理解
  • 集群聊天服务器项目【C++】项目介绍和环境搭建
  • SegmentFault for Android 3.0 发布
  • [译]如何构建服务器端web组件,为何要构建?
  • egg(89)--egg之redis的发布和订阅
  • Kibana配置logstash,报表一体化
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • ViewService——一种保证客户端与服务端同步的方法
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 从输入URL到页面加载发生了什么
  • 记一次用 NodeJs 实现模拟登录的思路
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 什么是Javascript函数节流?
  • 手写双向链表LinkedList的几个常用功能
  • 跳前端坑前,先看看这个!!
  • 王永庆:技术创新改变教育未来
  • 我的面试准备过程--容器(更新中)
  • 如何正确理解,内页权重高于首页?
  • ​水经微图Web1.5.0版即将上线
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma 指令
  • #pragma预处理命令
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (四)库存超卖案例实战——优化redis分布式锁
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)SvelteKit教程:hello world
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)平衡树
  • (转)原始图像数据和PDF中的图像数据
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net framework4与其client profile版本的区别
  • .NET 材料检测系统崩溃分析