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>>(); 建立才安全
解決 Asp.net core bad request headers to long · Issue
這個問題的原因是瀏覽器對request header 長度有限制,當我們的使用者關聯了太多的許可權permissions set, 系統預設把這些資訊全部加密後存在 Cookie Name .AspNetCore.Identity.Application這裡,你會發現非常大。
我的做法就是要把這些資訊儲存到記憶體裡當然也可以儲存到資料庫中,選中儲存記憶體更簡單,但是如果伺服器重啟或是資源回收,客戶端需要重新登入,並且會佔用伺服器內容。
第一步:建立一個MemoryTicketStore用於存放Identity資訊
第二部 修改配置把認證授權資訊從cookie轉存到我們指定的記憶體裡
這樣問題就解決了
希望對學習Blazor的同學有幫助。