• 从零开始Blazor Server(7)--使用Furion权限验证


    上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限。


    其实我们既然集成了Fution,就可以用Furion带的方式来验证。

    创建AdminHandler

    我们还是去创建AdminHandler,但是跟策略不一样的是我们的Handler不继承于AuthorizationHandler,而是继承Furion的AppAuthorizeHandler

    public class AdminHandler : AppAuthorizeHandler

    AppAuthorizeHandler有两个比较重要的方法。

    public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)

    public override async Task HandleAsync(AuthorizationHandlerContext context)

    PipelineAsync进入的时候已经完成了基本的验证,能确定该用户已经登录了,返回值是一个bool


    HandleAsync就是我们使用策略时的HandleRequirementAsync,也需要用context.Succeed来做处理。


    这里我们就直接使用PipelineAsync就行了,比较省心。所以我们的代码如下:

    public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
        {
            if (!int.TryParse(context.User.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
            {
                return Task.FromResult(false);
            }
            if (context.Resource is RouteData routeData)
            {
                var routeAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
                    x.AttributeType == typeof(RouteAttribute));
                if (routeAttr == null)
                {
                    return Task.FromResult(true);
                }
                else
                {
                    var url = routeAttr.ConstructorArguments[0].Value as string;
                    var permission = PermissionEntity
                        .Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == url).First();
                    if (permission != null)
                    {
                        return Task.FromResult(true);
                    }
                }
            }
            
            return Task.FromResult(false);
        }

    整体的逻辑与使用策略时相同。这里不再多说了。

    App.razor

    App里一样要加上Resource="@routeData" ,不然我们无法获取到路由信息。

    Pragram.cs

    我们同样需要在Proagram.cs里注册我们的Handler,但是比使用策略注册要简单的多,只需要一句话。

    builder.Services.AddAppAuthorization<AdminHandler>();

    使用

    我们的Handler默认是默认策略,所以我们不需要在加策略名称,只需要在需要使用的地方,比如index.razor中增加

    @attribute [Authorize]

    即可。


    源码在github:https://github.com/j4587698/BlazorLearn,分支lesson7.

  • 相关阅读:
    HCNP Routing&Switching之RSTP保护
    Windows 11 22621.1 , 10.0.22622.290 文件资源管理器中启用多标签,全新导航栏
    【无标题】
    阿里云有奖体验:用PolarDB-X搭建一个高可用系统
    基于JAVAWEBOA办公信息管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
    无人机电力巡检:国网安徽实际案例解析
    Allegro 17.4 SMD 敷铜,Shape 敷铜属性更改, Gerber 生成
    网络威胁情报git【全面】
    JS-DOM BOM(未完)
    【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行
  • 原文地址:https://www.cnblogs.com/j4587698/p/16549798.html