之前我们一直使用的是微软自带的身份验证方式,即使用[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)--权限验证的更多相关文章

  1. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  2. 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程

    从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程   用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...

  3. [Asp.Net Core] 关于 Blazor Server Side 的一些杂项, 感想

    在2016年, 本人就开始了一个内部项目, 其特点就是用C#构建DOM树, 然后把DOM同步到浏览器中显示. 并且在一些小工程中使用. 3年下来, 效果很不错, 但因为是使用C#来构建控件树, 在没有 ...

  4. [Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作客户端浏览器软件

    前言 大家用过微信PC端吧? 这是用浏览器做的. 用过Visual Studio Code吧? 也是用浏览器做的. 听说, 暴雪客户端也包含浏览器核心?? 在客户端启动一个浏览器, 并不是什么难事了. ...

  5. .net core使用Ocelot+Identity Server统一网关验证

    源码下载地址:下载 项目结构如下图: 在Identity Server授权中,实现IResourceOwnerPasswordValidator接口: public class IdentityVal ...

  6. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】

    前言 关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想: 一.Swagger的使用 3.3 JWT权限验证[修改] 二.解决JWT权限验证过期问题 三.JWT完美实现权限与接口的动态分 ...

  7. Nginx ACCESS阶段 统一的用户权限验证系统

    L59 需要编译到Nginx --with-http_auth_request_module 功能介绍: 主要当收到用户请求的时候 通过反向代理方式生成子请求至上游服务器,如果上游服务器返回2xx 则 ...

  8. 记一次 java 连接 linux ssh服务 权限验证失败的原因和解决过程

    下面的问题我是通过之前的ssh测试类找出原因的,因为我的测试类跑通了,但是程序跑不通,看了一下源码发现还有一处没有进行解密,所以才会权限验证失败. // 出现权限验证失败的原因就在这里,因为老板要求对 ...

  9. nginx-rtmp加入权限验证的简单方法

    nginx-rtmp-module默认不限制推流权限.播放权限.如果想加入权限验证,有很多种方法. 方法一:修改源码如: 如何给 nginx rtmp 服务加入鉴权机制 http://blog.csd ...

  10. golang实现文件上传权限验证(超简单)

    Go语言创建web server非常简单,部署也很容易,不像IIS.Apache等那么重量级,需要各种依赖.配置.一些功能单一的web 服务,用Go语言开发特别适合.http文件上传下载服务,在很多地 ...

随机推荐

  1. psd切图

    打开UI设计师给你的PSD文件,我们以下图为例,截产品超市前面的购物车 1.按v选择移动工具,然后在上面的选项栏中勾选自动选择,在再右边选择图层 2.这时候用鼠标选中产品超市前面的购物车,就能在右边的 ...

  2. jQuery 遍历each()的使用方法

    .each()是一个for循环的包装迭代器.each()通过回调的方式处理,并且会有2个固定的实参,索引与元素(从0开始计数).each()回调方法中的this指向当前迭代的dom元素 遍历方法: & ...

  3. 探究Android SQLite3多线程

    最近做项目时在多线程读写数据库时抛出了异常,这自然是我对SQlite3有理解不到位的地方,所以事后仔细探究了一番. 关于getWriteableDataBase()和getReadableDataba ...

  4. Banner 切换

    在线项目 :  Banner 切换 时间 : 2个小时 (15:00 - 17:00)满分 : 100分------------------------------------------------ ...

  5. iOS 倒计时

    // // RootViewController.m // MyTimerDemo // // Created by huluo on 1/21/14. // Copyright (c) 2014 b ...

  6. 安卓中onBackPressed ()方法的使用

    一.onBackPressed()方法的解释 这个方法放在 void android.app.Activity.onBackPressed() 在安卓API中它是这样解释的: public void ...

  7. hdu4405(概率dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意:跳棋有0~n个格子,每个格子X可以摇一次色子,色子有六面p(1=<p<=6), ...

  8. FZU 1063 三维扫描

    水题.DFS求连通块. #include<cstdio> #include<cstring> #include<cmath> #include <iomani ...

  9. 深入理解Java常用类----String

         Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...

  10. Swift3翻天覆地的改变

    经历了从swift 1.0 到2.0,一个版本之后代码居然就不兼容了.这如何在团队推广呢?没有想到3.0居然变化更加的大.有多大,来体会一下: UIFont.preferredFontForTextS ...