序
之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]
标签来做。
但是这种方式十分不灵活,微软推荐的方式是加Policy
,但是这种方式对我们来说还是不够灵活。
所以本节我们用完全自己校验的方式完成权限验证。
OnNavigateAsync介绍
在 App.razor 里面的Router
节点,微软给了一个OnNavigateAsync
方法,这个方法在每次路由跳转的时候都会执行,所以我们可以把我们的权限验证搬到这里来。
App.razor
首先,我们在Router
节点上增加OnNavigateAsync
:
<Router AppAssembly="@typeof(App).Assembly" OnNavigateAsync="PermissionCheck">
这里我们的方法叫做PermissionCheck
。
然后我们来看这个PermissionCheck
方法。
private void PermissionCheck(NavigationContext context)
{
var whiteList = Furion.App.Configuration["WhiteList"];
if (whiteList != null && whiteList.Split(',').Contains(context.Path))
{
return;
}
var user = Furion.App.User;
if (user == null)
{
NavigationManager.NavigateTo("/Login");
return;
}
if (user.Identity?.IsAuthenticated != true)
{
NavigationManager.NavigateTo("/Login");
return;
}
if (!int.TryParse(user.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
{
NavigationManager.NavigateTo("/Login");
return;
}
var permission = PermissionEntity
.Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == context.Path).First();
if (permission == null)
{
NavigationManager.NavigateTo("/Login");
}
}
这里我们需要把Login
这个页面拿出来,因为我们的Login
页面应该是一个白名单页面,无需登录也可以访问,所以我在appsettings.json
中增加了一项,为WhiteList
,这里面以,
分隔,所有在这里面的路径都是白名单路径,可以不用登录直接访问。
"WhiteList": "Login"
这里注意,
OnNavigateAsync
给的Path
是相对路径,不带最前面的/
,所以我们的Login
也不能有/
。
这里判断如果是白名单,则直接return
,正常跳转。
var user = Furion.App.User;
if (user == null)
{
NavigationManager.NavigateTo("/Login");
return;
}
if (user.Identity?.IsAuthenticated != true)
{
NavigationManager.NavigateTo("/Login");
return;
}
然后获取我们的登录信息,如果没有登录,那么直接跳转到Login
页面。
if (!int.TryParse(user.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
{
NavigationManager.NavigateTo("/Login");
return;
}
这里获取我们当时在LoginController
里的RoleId
。
这里注意,我稍微改了一下,之前的文章里我们这里面放的是
RoleName
,本来是打算根据用户再获取权限,但是后来想想有点麻烦,就稍微改动了一下,具体的可以看下新的源码。实战中建议还是不要直接放RoleId
进去,因为这个玩意在实战中往往是一对多的。
var permission = PermissionEntity
.Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == context.Path).First();
if (permission == null)
{
NavigationManager.NavigateTo("/Login");
}
最后我们判断一下数据库里这个角色有没有这个路径的权限,如果没有,我们就跳转。
这样我们就可以实现根据path来判断权限了。
这里由于是教程类的,所以所有的判断我都是直接从数据库里取得,正式使用的时候建议放到缓存里面,如果没有页面都走一次数据库,那么数据库的压力会非常大。
默认数据的路径我稍微修改了一下,去掉了前面的
/
,这里直接把数据库给删掉,然后重新运行就行了。
源码在github:https://github.com/j4587698/BlazorLearn,分支lesson5
从零开始Blazor Server(5)--权限验证的更多相关文章
- 从零开始学 Java - Spring AOP 实现用户权限验证
每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...
- 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程 用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...
- [Asp.Net Core] 关于 Blazor Server Side 的一些杂项, 感想
在2016年, 本人就开始了一个内部项目, 其特点就是用C#构建DOM树, 然后把DOM同步到浏览器中显示. 并且在一些小工程中使用. 3年下来, 效果很不错, 但因为是使用C#来构建控件树, 在没有 ...
- [Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作客户端浏览器软件
前言 大家用过微信PC端吧? 这是用浏览器做的. 用过Visual Studio Code吧? 也是用浏览器做的. 听说, 暴雪客户端也包含浏览器核心?? 在客户端启动一个浏览器, 并不是什么难事了. ...
- .net core使用Ocelot+Identity Server统一网关验证
源码下载地址:下载 项目结构如下图: 在Identity Server授权中,实现IResourceOwnerPasswordValidator接口: public class IdentityVal ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】
前言 关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想: 一.Swagger的使用 3.3 JWT权限验证[修改] 二.解决JWT权限验证过期问题 三.JWT完美实现权限与接口的动态分 ...
- Nginx ACCESS阶段 统一的用户权限验证系统
L59 需要编译到Nginx --with-http_auth_request_module 功能介绍: 主要当收到用户请求的时候 通过反向代理方式生成子请求至上游服务器,如果上游服务器返回2xx 则 ...
- 记一次 java 连接 linux ssh服务 权限验证失败的原因和解决过程
下面的问题我是通过之前的ssh测试类找出原因的,因为我的测试类跑通了,但是程序跑不通,看了一下源码发现还有一处没有进行解密,所以才会权限验证失败. // 出现权限验证失败的原因就在这里,因为老板要求对 ...
- nginx-rtmp加入权限验证的简单方法
nginx-rtmp-module默认不限制推流权限.播放权限.如果想加入权限验证,有很多种方法. 方法一:修改源码如: 如何给 nginx rtmp 服务加入鉴权机制 http://blog.csd ...
- golang实现文件上传权限验证(超简单)
Go语言创建web server非常简单,部署也很容易,不像IIS.Apache等那么重量级,需要各种依赖.配置.一些功能单一的web 服务,用Go语言开发特别适合.http文件上传下载服务,在很多地 ...
随机推荐
- psd切图
打开UI设计师给你的PSD文件,我们以下图为例,截产品超市前面的购物车 1.按v选择移动工具,然后在上面的选项栏中勾选自动选择,在再右边选择图层 2.这时候用鼠标选中产品超市前面的购物车,就能在右边的 ...
- jQuery 遍历each()的使用方法
.each()是一个for循环的包装迭代器.each()通过回调的方式处理,并且会有2个固定的实参,索引与元素(从0开始计数).each()回调方法中的this指向当前迭代的dom元素 遍历方法: & ...
- 探究Android SQLite3多线程
最近做项目时在多线程读写数据库时抛出了异常,这自然是我对SQlite3有理解不到位的地方,所以事后仔细探究了一番. 关于getWriteableDataBase()和getReadableDataba ...
- Banner 切换
在线项目 : Banner 切换 时间 : 2个小时 (15:00 - 17:00)满分 : 100分------------------------------------------------ ...
- iOS 倒计时
// // RootViewController.m // MyTimerDemo // // Created by huluo on 1/21/14. // Copyright (c) 2014 b ...
- 安卓中onBackPressed ()方法的使用
一.onBackPressed()方法的解释 这个方法放在 void android.app.Activity.onBackPressed() 在安卓API中它是这样解释的: public void ...
- hdu4405(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意:跳棋有0~n个格子,每个格子X可以摇一次色子,色子有六面p(1=<p<=6), ...
- FZU 1063 三维扫描
水题.DFS求连通块. #include<cstdio> #include<cstring> #include<cmath> #include <iomani ...
- 深入理解Java常用类----String
Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...
- Swift3翻天覆地的改变
经历了从swift 1.0 到2.0,一个版本之后代码居然就不兼容了.这如何在团队推广呢?没有想到3.0居然变化更加的大.有多大,来体会一下: UIFont.preferredFontForTextS ...