当前位置: 欣欣网 > 码农

在Blazor应用中实现认证授权:一步步构建安全的.Net项目

2024-02-16码农

在.Net领域,认证授权机制一直是维护项目安全的重要组成部分。了解如何在最新的Web框架Blazor中实施认证和授权机制,不仅可以帮助你的应用保护敏感数据,更能为用户提供个性化的交互体验。本文,我们将深入探讨如何在Blazor项目中加入认证授权的具体做法,并分享一个具体实施案例: AntSK 项目。

一、Blazor认证授权的首步:依赖注入

首先,认证授权功能的基础离不开依赖注入(Dependency Injection)。这是.NET Core平台的核心功能之一,Blazor自然也不例外。通过下述代码,我们可以向服务容器中添加认证授权相关的服务:

builder.Services.AddAuthorizationCore();builder.Services.AddScoped<AuthenticationStateProvider, AntSKAuthProvider>();

以上代码中, AddAuthorizationCore 方法用于添加核心认证授权服务,而 AddScoped 方法则将我们自定义的 AntSKAuthProvider 鉴权类注入为 AuthenticationStateProvider 的实现,它将负责提供当前用户的认证状态信息。

另外,可能你需要引用NuGet:

Microsoft.AspNetCore.AuthorizationMicrosoft.AspNetCore.Components.AuthorizationMicrosoft.AspNetCore.Components.WebAssembly.Authentication

二、自定义鉴权类 AntSKAuthProvider

为了满足特定项目需求,有时候我们需要定制鉴权逻辑。在 AntSK 项目中,我们创建了一个自定义的鉴权类 AntSKAuthProvider ,它继承自 AuthenticationStateProvider 并实现了用户登录的逻辑,如下所示:

public classAntSKAuthProvider : AuthenticationStateProvider{private ClaimsIdentity identity = new ClaimsIdentity();publicasync Task<bool> SignIn(string username, string password) {if (username == LoginOption.User && password == LoginOption.Password) {// 用户认证成功,创建用户的ClaimsIdentityvar claims = new[] { new Claim(ClaimTypes.Name, username) }; identity = new ClaimsIdentity(claims, "AntSK"); NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());returntrue; }else {// 用户认证失败returnfalse; } }publicoverride Task<AuthenticationState> GetAuthenticationStateAsync() {var user = new ClaimsPrincipal(identity);return Task.FromResult(new AuthenticationState(user)); }}

当调用 SignIn 方法尝试登录时,如果提供的用户名和密码与预设的管理员账户相匹配,就会创建一个包含用户名的 ClaimsIdentity ,然后通知系统认证状态已更改。相反,如果认证失败,该方法则返回 false

三、配置App.razor并启用CascadingAuthenticationState

为了让整个应用都能够感知到认证状态,我们需要在 App.razor 文件内封装所有的路由组件,使用 CascadingAuthenticationState 组件。代码如下:

@inject NavigationManager NavigationManager@using Microsoft.AspNetCore.Components.Authorization <CascadingAuthenticationState><RouterAppAssembly="@typeof(Program).Assembly"><!-- 路由配置 --></Router><AntContainer /></CascadingAuthenticationState>

通过上述配置,每个 RouteView 或组件都能通过 CascadingParameter 接收到当前的认证状态了。

四、实施页面访问控制:AuthComponentBase

在用户尝试访问需要登录的页面时,我们应当进行权限检查。实现这一目的的一种方法是创建 AuthComponentBase 类,让需要验证用户的页面继承该类。

public classAuthComponentBase : ComponentBase{// 注入相关服务 [Inject]public AuthenticationStateProvider AuthenticationStateProvider { get; set; } [Inject]public NavigationManager NavigationManager { get; set; }public ClaimsPrincipal User { get; set; }// 初始化时获取认证状态protectedoverrideasync Task OnInitializedAsync() {await GetAuthenticationStateAsync(); }// 检查用户的认证状态,未认证则重定向至登录页面privateasync Task GetAuthenticationStateAsync() {var authenticationState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); User = authenticationState.User;if (!User.Identity.IsAuthenticated) { NavigationManager.NavigateTo("/user/login"); } }}

子类继承自 AuthComponentBase 之后,在 OnInitializedAsync 阶段就会进行用户认证状态的检查,如果用户未认证,则自动重定向至登录页面。

@using AntSK.Services.Auth@inherits AuthComponentBase


五、AntSK项目实战应用

AntSK 项目不仅是一个开源的 AI知识库/智能体项目 ,也是一个实践Blazor认证授权机制的绝佳案例。以上分享的代码就是从AntSK项目中提取出来的,进一步学习与实操,欢迎访问 AntSK 项目的GitHub页面:

https://github.com/xuzeyu91/AntSK

在你自己的项目中集成认证和授权可能会有些复杂,但通过上述步骤详细演示了整个流程,希望能帮到正在构建Blazor应用程序的你。

结语

.Net领域的认证授权技术发展迅速,Blazor作为新的前端框架,为我们提供了新的实现途径。希望通过本文的分享,你能够更清晰地掌握如何为你的Blazor应用添加认证授权功能,提升应用的安全性与用户体验。同时,这不仅仅是技术实现的问题,更是一种对用户负责的体现,是每一个.Net开发者应该具备的基本能力。我们后续还将继续关注.Net相关技术的新动态,与大家分享更多实用技巧。