xuzeyu
xuzeyu
发布于 2024-08-26 / 47 阅读
1

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

        在.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.Authorization
Microsoft.AspNetCore.Components.Authorization
Microsoft.AspNetCore.Components.WebAssembly.Authentication

二、自定义鉴权类 AntSKAuthProvider

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


public class AntSKAuthProvider : AuthenticationStateProvider
{
    private ClaimsIdentity identity = new ClaimsIdentity();

    public async Task<bool> SignIn(string username, string password)
    {
        if (username == LoginOption.User && password == LoginOption.Password)
        {
            // 用户认证成功,创建用户的ClaimsIdentity
            var claims = new[] { new Claim(ClaimTypes.Name, username) };
            identity = new ClaimsIdentity(claims, "AntSK");
            NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
            return true;
        }
        else
        {
            // 用户认证失败
            return false;
        }
    }
    
    public override 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>
    <Router AppAssembly="@typeof(Program).Assembly">
        <!-- 路由配置 -->
    </Router>
    <AntContainer />
</CascadingAuthenticationState>

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

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

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


public class AuthComponentBase : ComponentBase
{
    // 注入相关服务
    [Inject]
    public AuthenticationStateProvider AuthenticationStateProvider { get; set; }
    [Inject]
    public NavigationManager NavigationManager { get; set; }
    public ClaimsPrincipal User { get; set; }

    // 初始化时获取认证状态
    protected override async Task OnInitializedAsync()
    {
        await GetAuthenticationStateAsync();
    }

    // 检查用户的认证状态,未认证则重定向至登录页面
    private async 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相关技术的新动态,与大家分享更多实用技巧。