在.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 classAntSKAuthProvider : AuthenticationStateProvider
{
private ClaimsIdentity identity = new ClaimsIdentity();
publicasync 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());
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相關技術的新動態,與大家分享更多實用技巧。