Blazor Server完美實現Cookie Authorization and Authentication

2022-12-04 06:00:47

Blazor server-side application用Microsoft.AspNetCore.Identity.EntityFrameworkCore實現Authorization 和 Authentication 完整教學。

本方案只適用於Blazor Server-Size Application

完整專案原始碼,參考: https://github.com/neozhu/CleanArchitectureWithBlazorServer

需要參照的類庫如下:

    <PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="7.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="7.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="7.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Duende.IdentityServer" Version="6.2.0" />
    <PackageReference Include="Duende.IdentityServer.AspNetIdentity" Version="6.2.0" />
    <PackageReference Include="Duende.IdentityServer.EntityFramework" Version="6.2.0" />
    <PackageReference Include="Duende.IdentityServer.EntityFramework.Storage" Version="6.2.0" />
    <PackageReference Include="Duende.IdentityServer.Storage" Version="6.2.0" />

  

這裡的實現方式和Asp.net core 3.0,5.0,6.0, 7.0 幾乎一樣的設定,但又也有一些特殊之處。下面我分享一下的程式碼。

從上面參照的類庫發現我並使用的是Microsoft.AspNetCore.Identity.EntityFrameworkCore + Duende.IdentityServer 都已經升級到最新版本。

設定 Microsoft.AspNetCore.Identity.EntityFrameworkCore 

用於生成需要後臺表

 

 

 這裡和微軟官方的檔案略有不同我使用的AddIdentity方法。

新增 Authorization and Authentication 設定

 

 

 這類servicescollection設定和asp.net core cookie認證是一直,只是這裡不需要設定Login,Logout路徑

開發一個登入Blazor Component(Page)

 

 重點這裡需要生成一個Token,而不是直接傳使用者名稱+密碼,因為安全 不能明文傳輸密碼。這裡我們需要呼叫auth/login?token=.... 實現登入

AuthController 使用者登入並獲取授權

 

 這裡的寫法和asp.net core登入一樣都使用SignInManager<ApplicationUser> 登入成功後和asp.net core應用一樣儲存於賬號相關的所有授權比如Roles和Claims 

如何需要自定義新增自定義的內容比如下面的TenantId TenantName ,ApplicationClaimsIdentityFactory就是用於新增需要內容。

 

 獲取當前登入的賬號資訊

 

 之前Blazor Server-Side application 是不支援 IHttpContextAccessor獲取賬號資訊,現在竟然可以了。

Blazor server Component呼叫UserManager<ApplicationUser>需要注意的地方

 

Component需要繼承 新增 @inherits OwningComponentBase

 

 需要通過ScopedServices.GetRequiredService<UserManager<ApplicationUser>>(); 建立才安全

希望對學習Blazor的同學有幫助。