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的同學有幫助。