當前位置: 妍妍網 > 碼農

在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相關技術的新動態,與大家分享更多實用技巧。