从零开始Blazor Server(6)--基于策略的权限验证

现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式。

本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发布就过时的状态,就很尴尬,所以后面的就稍微拖一拖。

加上昨天有人说我用OnNavigateAsync违反单一性原则,要用策略,所以这里我们说下策略怎么做。

添加策略相关的代码

首先我们要有一个实现IAuthorizationRequirement接口的类,这个类没有什么特别的要求,我们就写一个空类来处理。

public class AdminRequirement : IAuthorizationRequirement
{
    
}

然后要写一个Handler,来继承这个AuthorizationHandler<AdminRequirement>,其中泛型是我们上面的实现接口的类。

public class AdminRequirementHandler : AuthorizationHandler<AdminRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminRequirement requirement)
    {
        
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

实现HandleRequirementAsync方法,这个方法就是我们的关键方法,授权的实现就在这里面。

其中默认的授权状态是Fail,如果我们希望允许通过,就执行context.Succeed(requirement);来告诉策略我们认证成功了。

添加授权认证

Program.cs里我们需要把这两个都注册进去,首先注册我们的Handler

builder.Services.AddSingleton<IAuthorizationHandler, AdminRequirementHandler>();

然后注册我们的授权策略

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Admin", policy => policy.Requirements.Add(new AdminRequirement()));
});

这里的Admin就是我们的策略名字。

使用策略

在我们需要认证的位置增加特性@attribute [Authorize(Policy = "Admin")],然后在我们的授权策略里打断点,应该就会发现断点进入了。

将RouteData传入

因为Blazor里面我们拿不到HttpContext,所以没法用Request.Path的方式来拿到url,所以只能使用将RouteData作为Resource传入,然后使用attribute的方式拿到。

这里我们在App.razor里传入routeData

<AuthorizeRouteView Resource="@routeData" RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    <RedirectToLogin></RedirectToLogin>
                </NotAuthorized>
            </AuthorizeRouteView>

然后修改HandleRequirementAsync

if (context.User.Identity?.IsAuthenticated != true)
        {
            return Task.CompletedTask;
        }

        if (!int.TryParse(context.User.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
        {
            return Task.CompletedTask;
        }
        if (context.Resource is RouteData routeData)
        {
            var routeAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
                x.AttributeType == typeof(RouteAttribute));
            if (routeAttr == null)
            {
                context.Succeed(requirement);
            }
            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)
                {
                    context.Succeed(requirement);
                }
            }
        }
        
        return Task.CompletedTask;
    }

这里跟上一篇的处理思路整体一样,首先我们判断如果用户都没登录,那就直接失败,如果登录了我们就去拿RoleId,拿不到自然就失败。

不同点在下面,我们没法直接拿到Path,所以我们只能去找RouteAttribute,其实就是我们的@page路由。这里我们也可以自己定义一个Attribute取自己的。

如果我们没找到这个,证明这应该不是个blazor页面,我们就暂时让它成功。

如果找到了,那么我们就找routeAttr.ConstructorArguments[0].Value as string,这里面就是对应的路由地址了。

下面就跟之前一样,用路由地址来判断是否是又权限就行了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ASP.NET Core Blazor Server 应用程序可以使用 ASP.NET Core 身份验证来实现登录认证和权限控制。以下是实现此功能的基本步骤: 1. 在 Startup.cs 文件的 ConfigureServices 方法中添加身份验证和授权服务: ``` services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login"; options.LogoutPath = "/Logout"; }); services.AddAuthorization(options => { options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin")); }); ``` 2. 在 Configure 方法中启用身份验证和授权中间件: ``` app.UseAuthentication(); app.UseAuthorization(); ``` 3. 在需要身份验证和授权的页面或组件上使用 AuthorizeView 组件: ``` <AuthorizeView Policy="AdminOnly"> <Authorized> <!-- 显示受保护的内容 --> </Authorized> <NotAuthorized> <!-- 显示未授权的内容 --> </NotAuthorized> </AuthorizeView> ``` 4. 在登录页面或组件中使用 SignInManager 和 UserManager 进行身份验证: ``` var result = await _signInManager.PasswordSignInAsync(username, password, rememberMe, lockoutOnFailure: false); if (result.Succeeded) { return RedirectToPage("/Index"); } else { ModelState.AddModelError(string.Empty, "用户名或密码不正确。"); return Page(); } ``` 以上是实现 ASP.NET Core Blazor Server 应用程序的基本身份验证和授权功能的步骤。根据具体需求,还可以使用自定义身份验证方案、角色和策略来进行更复杂的权限控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jh035

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值