既然是简单粗暴,那么就不用关心诸如 IDentityServer4,OAuth 之类的组件,也不使用 AuthenticationStateProvider、IAuthService, razor 页面上不用折腾 CascadingAuthenticationState 或者 AuthorizeView,单纯用 Blazored.LocalStorage 搞事情就足够了。要实现的效果也很简单,就是已登录的用户正常显示,没有登录的用户强制跳转到登录页,重点就在 MainLayout.razor 的 @code{} 里面

@inherits LayoutComponentBase
@inject NavigationManager nav
@inject MessageService msg
@inject Blazored.LocalStorage.ILocalStorageService storage
@using BlazorLoginDemo.Data <CascadingValue Value="currUser">
<Layout Style="min-height: 100vh; ">
<Sider Style="overflow: auto;height: 100vh;position: fixed;left: 0;">
<div style="height:55px; color:white; margin-left:10px;margin-top:5px;">
<Icon Type="github" Width="48" Height="48" Style="vertical-align:middle" />
<span style="font-size:24pt; vertical-align:middle">Blazone</span>
</div>
<NavMenuAnt />
</Sider>
<Layout Class="site-layout" Style=" margin-left: 200px">
<Header Class="site-layout-background">
<LoginControl ChildEvents="(e)=>LogoutEvent(e)"/>
</Header>
<Content Style="margin: 24px 16px 0; overflow: initial;">
@Body
</Content>
<Footer Style=" text-align: center;">
Blazone &copy;2021
</Footer>
</Layout>
</Layout>
</CascadingValue> @code{
/// <summary>
/// 强制刷新标志
/// </summary>
private bool forceRender { get; set; } = false;
private void LogoutEvent(object username)
{
msg.Info($"See you later {(string)username}");
//通过 LoginControl 组件回调 接收强制刷新消息
forceRender = true;
} protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender || forceRender )
{
forceRender = false; currUser = await CurrentUser.Load(storage);
if (null == currUser)
nav.NavigateTo("/Login");
else
StateHasChanged(); }
}
/// <summary>
/// 有 CascadingValue 加持, 所有子组件可以通过 [CascadingParameter] 继承读取
/// </summary>
private CurrentUser currUser { get; set; } }

CurrentUser.Load() 方法就是从 LocalStorage 中把用户身份信息读出来

        public static async Task<CurrentUser> Load(ILocalStorageService localStorage)
{
var s = await localStorage.GetItemAsync<string>(LOCAL_STORAGE_KEY);
return fromStorageString(s);
}

唯一需要注意的是, ILocalStorageService 对象要等到页面渲染完成以后才能调用,所以只能放在 OnAfterRenderAsync() 里面,OnInitialize()中调用它是不行的。

最后说一下登录与登出的操作:

1.登录只需要在登录按钮的 OnClick() 里面比对用户名口令,通过就存储用户身份信息到 LocalStorage,然后跳转到默认首页即可;

2.登出稍微曲折一点,,定制一个 LoginControl.razor 组件,用于显示登录用户名和登出按钮, 在登出按钮的 OnClick() 中移除 LocalStorage中保存的用户身份信息,触发一个ClientEvent 通知 MainLayout.razor 要强制刷新,最后再重新定向到首页或者登录页即可。

@page "/loginControl"
@using BlazorLoginDemo.Data
@inject NavigationManager nav
@*@inject Blazored.SessionStorage.ISessionStorageService storage*@
@inject Blazored.LocalStorage.ILocalStorageService storage @if (null == currUser)
{
<p style="color:white"><em>Loading...</em></p>
}
else
{
<div style="text-align:right; color:white;">
Welcome,<b> @currUser.UserName </b>!
<Button Type="primary" Shape="round" Size="normal"
Icon="logout" OnClick="logout" >退出</Button>
</div>
}
@code {
[CascadingParameter]
protected CurrentUser currUser{ get; set; } [Parameter]
public EventCallback<string> ChildEvents { get; set; }
private async Task RaiseEvent()
{
if (ChildEvents.HasDelegate)
{
await ChildEvents.InvokeAsync(currUser.UserName);
StateHasChanged();
}
} private async Task logout()
{
await RaiseEvent(); await CurrentUser.Remove(storage);
nav.NavigateTo("/");
}
}

至于 LocalStorage 中保存的用户身份信息要存储哪些数据,要不要设置登录有效期,怎么保护是数字签名还是AES加密,就按你的喜好自由发挥了。

要是觉得 LocalStorage 一直存着不放心,还有 Blazored.SessionStorage.ISessionStorageService 可以选用,关掉窗口就清空了。

参考文献:

1.Blazor 极简登录模型

2.使用 Blazor 开发内部后台(三):登录

简单粗暴的实现 Blazor Server 登录鉴权的更多相关文章

  1. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战

    拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证.参数校验.限流等通用操作. 系列 云原生 API 网关,gRPC ...

  2. 一步步教会你微信小程序的登录鉴权

    前言 为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口.乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态.本文就来手把手 ...

  3. vue项目中的登录鉴权

    用vue做一个简单的登录鉴权功能. 项目目录结构如下: Login 组件 登录成功后做本地存储和store存储,并进行跳转. Login.vue关键代码: async handleLogin(e) { ...

  4. 部署kubernetes-dashboard并配置ServiceAccount和登录鉴权

    "种草" kubernetes-dashboard 安装部署dashboard 创建用于登录面板的ServiceAccount 权限控制 "种草" kubern ...

  5. SpringCloud之Zuul过滤器实现登录鉴权实战(十一)

    自定义zuul过滤器实现登录鉴权实战 1.新建filter包 2.新建类继承ZuulFilter,重写方法 3.在类顶部加注解@Comment让spring扫描 /** * @author WGR * ...

  6. 使用网关zuul过滤器登录鉴权

    使用网关zuul过滤器登录鉴权     1.新建一个filter包         filte有很多种 pre.post.     2.新建一个类LoginFilter,实现ZuulFilter,重写 ...

  7. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(四):客户端强类型约束,自动生成 API TS 类型定义

    系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇 Go + gRPC-Gateway(V2) ...

  8. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(六):客户端基础库 TS 实战

    小程序登录鉴权服务,客户端底层 SDK,登录鉴权.业务请求.鉴权重试模块 Typescript 实战. 系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gatew ...

  9. Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇(内附开发 demo)

    简介 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 系列 云原生 API 网关,gRPC-Gateway V2 初探 业务流程 官方开发接入文档 ...

  10. 测试开发【Mock平台】04实战:前后端项目初始化与登录鉴权实现

    [Mock平台]为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React 框架完成搭建一个测试工具平台,希望作为一个实战项目能为你的测试开发学习有帮助. 一.后端 ...

随机推荐

  1. Linux 中 Crontab 执行时的环境变量问题(allure命令不执行)

    前几天做了UI自动化脚本部署linux服务器,但是放下脚本的allure命令不执行(生成allure报告和启动allure服务的命令不执行),然后就各种找问题,一开始怀疑是allure的环境变量问题, ...

  2. 18B20的CRC8校验分析

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验可以简单地描述为:例如我们要 ...

  3. windows10 idea springboot项目部署

    windows10 idea springboot项目部署 一,springboot项目 本次项目在原项目的基础之上进行了二次开发:添加了index.html页面 根据配置文件配置数据库 先创建数据库 ...

  4. 【Tutorial C】03 数据类型、变量

    在程序的世界中,可以让计算机按照指令做很多事情, 如进行数值计算.图像显示.语音对话.视频播放.天文计算.发送邮件.游戏绘图以及任何我们可以想象到的事情. 要完成这些任务,程序需要使用数据,即承载信息 ...

  5. 【OracleDB】 03 数据类型和常见对象概述

    我们可以通过PLSQL来查看Oracle的数据类型 总分类: - 字符型 1.CHAR 0 - 2000 字节 固定长度字符串 2.NCHAR 0 - 1000 字节 固定长度字符串[Unicode字 ...

  6. 【GPU】如何两周内零经验手搓一个GPU | 美国工程师极限挑战 | 重写三次 | CUDA | SIMD | ISA指令集 | Verilog | OpenLane

    地址: https://www.youtube.com/watch?v=FTh-c2ek6PU

  7. 大语言模型(LLM)运行报错:cannot import name 'AutoModel' from 'transformers'

    解决方法: 安装pytorch即可,不过需要注意项目的README文件和requirements文件,安装对应版本的pytorch即可.

  8. 阿里的镜像站不稳定如何解决——通过清华镜像站安装阿里的python包

    最近在看阿里的python包,原因是为了看下阿里的modelscope服务,不过一个十分搞笑的一个事情,那就是阿里的python包在阿里网站上是访问不了的,只能换到其他镜像站来下载. 使用阿里的pyp ...

  9. 程序员学习网站推荐:路线向导(roadmap.sh)

    网站地址: https://roadmap.sh/ 在外网的技术论坛上看到这个网站,上面给出多种编程语言的学习路线,也就是给出不同编程语言的从易到难的组成内容(语言特性),通过这个网站可以辅助学习编程 ...

  10. 强化学习中Q-learning,DQN等off-policy算法不需要重要性采样的原因

    在整理自己的学习笔记的时候突然看到了这个问题,这个问题是我多年前刚接触强化学习时候想到的问题,之后由于忙其他的事情就没有把这个问题终结,这里也就正好把这个问题重新的规整一下. 其实,这个DQN算法作为 ...