從零開始Blazor Server(3)–添加cookie授權

  • 2022 年 7 月 29 日
  • 筆記

認證方式簡述

Blazor Server微軟官方還是推薦直接使用Cookie授權,因為本來Blazor Server就是前後端不分離的。不存在Cookie跨域等一系列問題。

只要不是使用SSO之類的統一登錄方式,建議直接使用Cookie作為認證方式就行,簡單方便。

添加Cookie認證

Blazor添加Cookie認證的方式跟MVC沒什麼區別,也是在Program.cs里添加對應的認證中間件。

  1. 添加Cookie認證方式

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
  1. 增加認證中間件

app.UseAuthentication();
app.UseAuthorization();

這個處理是不是跟使用MVC的時候一模一樣?

這裡需要注意,Blazor Server只有第一次連接的時候會走中間件,之後連接成功就是SingalR了,不會每個請求都走中間件,所以之前的MVC的那種在中間件或者過濾器里進行處理的路子走不通了。

新建Login.razor

我們需要新建一個登錄頁面,本篇暫時只是放一個佔位頁,不實現登錄,下一篇我們再來完成登錄。

這裡需要注意,Login頁面應該是獨立布局的,不應該有MainLayout的菜單布局,但是我們在App.razor里指定了默認布局,這裡怎麼辦呢。

我們選用一種最簡單的辦法,就是新建一個空布局,讓Login頁面使用我們的空布局。

首先我們在Shared裏面新建一個LoginLayout,這個就是一個空Layout。

LoginLayout.razor

@inherits LayoutComponentBase

@Body

標準的一個Layout模板,繼承於LayoutComponentBase,然後裏面只有一個@Body

然後新建一個Login.razor,指定它的布局為LoginLayout

Login.razor

@page "/Login"
@layout LoginLayout

<h3>Login</h3>

創建RedirectToLogin組件

這個組件沒有其他任何作用,就是在未登錄時跳轉到登錄頁面。

REdirectToLogin.razor

@inject NavigationManager NavigationManager

@code {
    protected override void OnInitialized()
    {
        base.OnInitialized();
        NavigationManager.NavigateTo("/Login", true);
    }
}

這裡注意,NavigationManager.NavigateTo("/Login", true);方法在Debug時會報錯,這個錯誤我個人認為是微軟的鍋,在.net 6上目前沒找到什麼合適的解決辦法。這裡報錯就直接點擊繼續,不會有任何其他影響,並且Release下不會報錯。如果你用Rider的Run來執行,也不會報錯。

如果各位大佬知道如何能解決這個報錯,請留言告訴我一下,感激不盡。

修改App.razor

這裡我們需要把原來的RouteView修改為AuthorizeRouteView

這個AuthorizeRouteView是Blazor自帶的一個授權組件,它內部處理了授權信息,內部有NotAuthorizedAuthorizing可供使用。

  • NotAuthorized即未授權的情況,這種情況如果不寫,默認好像是顯示一行文字,Not Authorized。內部是一個RenderFragment所以可以添加任何內容。

  • Authorizing是授權認證中顯示的文字,我們使用Cookie認證的話一般不會有這種情況,但是如果我們使用統一認證,或者其他網絡認證的時候,可能會有等待認證的時間,這時候就會顯示這裡的內容。

我們需要的是跳轉到登錄頁面,所以我們就在NotAuthorized的時候加載我們的RedirectToLogin的組件即可。

<NotAuthorized>
                    <RedirectToLogin></RedirectToLogin>
                </NotAuthorized>

Index頁面增加授權

這個最簡單,就是在需要授權的頁面上增加[Authorize]標籤即可。

@attribute [Authorize]

這樣我們直接F5運行程序,應該就會發現自動跳轉到了Login路徑下。

源碼在github://github.com/j4587698/BlazorLearn,分支為lesson3