在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应用程序的你。

AntSK:打造.Net全能AI智能知识库,共启智能化管理新时代!

结语

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Blazor Server是一种基于ASP.NET Core的Web开发框架,它允许您使用C#语言开发现代Web应用程序。在Blazor Server,您可以使用cookie认证授权或JWT认证授权来保护您的应用程序。 ### Blazor Server Cookie认证授权 Blazor Server的cookie认证授权与ASP.NET Core的cookie认证授权非常相似。您可以使用ASP.NET Core Identity来管理用户和角色,并使用`[Authorize]`属性来标记需要授权才能访问的组件。 首先,您需要在ASP.NET Core应用程序启用身份验证和授权。然后,您可以使用Identity提供的API来管理用户和角色。 接下来,您需要在Blazor组件使用`[Authorize]`属性来标记需要授权才能访问的组件。这将要求用户登录,并检查他们是否具有访问该组件的权限。 最后,您可以使用`HttpContext`类来访问当前用户的身份信息,以及验证他们是否具有所需的角色和权限。 下面是一个示例,演示如何在Blazor Server应用程序使用cookie认证授权: ``` @page "/myprotectedpage" @attribute [Authorize(Roles = "Admin")] <h1>Welcome to the protected page!</h1> @code { [Inject] private IHttpContextAccessor HttpContextAccessor { get; set; } private ClaimsPrincipal User => HttpContextAccessor.HttpContext.User; protected override async Task OnInitializedAsync() { // Check if the user has the required role if (!User.IsInRole("Admin")) { NavigationManager.NavigateTo("/accessdenied"); } } } ``` 在上面的示例,我们使用`[Authorize(Roles = "Admin")]`属性来标记需要“Admin”角色才能访问的组件。然后,我们使用`IHttpContextAccessor`来访问当前用户的身份信息,并检查他们是否具有所需的角色。如果用户没有所需的角色,我们将重定向到一个名为“accessdenied”的页面。 ### Blazor Server JWT认证授权 Blazor Server的JWT认证授权Blazor WebAssembly的JWT认证授权非常相似。您可以使用ASP.NET Core Identity和JSON Web Token(JWT)来实现JWT认证授权,并使用`[Authorize]`属性来标记需要授权才能访问的组件。 首先,您需要在ASP.NET Core应用程序配置JWT认证服务。然后,您可以使用Identity提供的API来管理用户和角色,以及实现基于角色的授权策略。 接下来,您需要在Blazor组件使用`[Authorize]`属性来标记需要授权才能访问的组件。这将要求用户登录,并检查他们是否具有访问该组件的权限。 最后,您可以使用JWT来验证用户身份,并根据用户的角色和权限来授权访问。 下面是一个示例,演示如何在Blazor Server应用程序使用JWT认证授权: ``` @page "/myprotectedpage" @attribute [Authorize(Roles = "Admin")] <h1>Welcome to the protected page!</h1> @code { [Inject] private IAccessTokenProvider TokenProvider { get; set; } private async Task<string> GetAccessTokenAsync() { var tokenResult = await TokenProvider.RequestAccessToken(); if (tokenResult.TryGetToken(out var token)) { return token.Value; } else { return null; } } protected override async Task OnInitializedAsync() { var accessToken = await GetAccessTokenAsync(); if (accessToken != null) { // Verify the token and extract the user's claims var handler = new JwtSecurityTokenHandler(); var token = handler.ReadJwtToken(accessToken); var userId = token.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value; var roles = token.Claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).ToList(); // Check if the user has the required role if (!roles.Contains("Admin")) { NavigationManager.NavigateTo("/accessdenied"); } } else { NavigationManager.NavigateTo("/login"); } } } ``` 在上面的示例,我们使用`[Authorize(Roles = "Admin")]`属性来标记需要“Admin”角色才能访问的组件。然后,我们使用`IAccessTokenProvider`来获取JWT访问令牌,并验证令牌以确定用户的身份和角色。如果用户没有所需的角色,我们将重定向到一个名为“accessdenied”的页面。 希望这些示例能够帮助您实现Blazor Server的cookie认证授权和JWT认证授权
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值