6.ASP.NET MVC 升級至 ASP.NET Core MVC 全記錄
(1)identity認證功能:
建立專案時雖然驗證類別有選了個別帳號,但Account Controllers消失了? 要客製化登入頁(如:加入驗證碼)怎麼做?
前置作業建立新專案時驗證類型要選[個別帳戶],
要先把Areas/Identity/Pages/Account目錄用Scaffolding變出來,
所以要先裝Scaffolding的套件Microsoft.VisualStudio.Web.CodeGeneration.Design(版本要對,不能都用最新穩定版),
再執行
(1.1)使用identity 擴充屬性(欄位)
(1.1.1)在Model中新增類別ApplicationUser.cs
(1.1.2)在專案下新增Services目錄,再新增程式碼ApplicationUserClaimsPrincipalFactory.cs
(1.1.3)在Program.cs,隱藏程式碼
加入程式碼
修改 Data/ApplicationDbContext 讓它使用擴充後的 ApplicationUser。
(1.1.4)執行時有可能的錯誤訊息排除:InvalidOperationException: No service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.
_LoginPartial.cshtml(或_Layout.cshtml)改為
(1.2)Account目錄用Scaffolding變出來
(1.2.1)需先建置專案一次,再執行aspnet-codegenerator
PS.如果(1.1)沒有先做完就執行aspnet-codegenerator, 產生的Razor會用的都原始的IdentityUser, 必需要改成自訂的ApplicationUser, 很多地方要改, 很耗時費力
PS.如果不需自訂 ApplicationUser屬性,只需要角色功能,可省略(1.1),只在Program.cs改寫
注意:若2層目錄時,需移到正確目錄下:C:\Users\guani\source\repos\YourProjectName\YourProjectName
注意:原Program.cs是採用builder.Services.AddDefaultIdentity,若要啟用「角色管理 (Roles)」,則需手動改builder.Services.AddIdentity,可自行去ChatGPT問二者的差異,它還會跟你詳述如何撰寫程式碼及Model。
注意:但有個關鍵點ChatGPT除錯會漏講,啟動專案就錯是因_LoginPartial.cshtml中,要改為【@inject SignInManager<ApplicationUser> SignInManager】及@inject UserManager<ApplicationUser> UserManager, 而不是其他Controller。
注意:開發者會開瀏覽器(如chrome)閱讀網頁, VS執行Debug時又再開同一品牌瀏覽器(crhome), 結束Debug後關閉瀏覽器, 但未關閉全部瀏覽器, 所以cookie未消失, 但Session會消失, 建議Debug用第二個品牌瀏覽器, 減少權限相關混亂。
參考來源:ChatGPT,Stack
(2)Database First連結DB建立Model
(2.1)指令
在NuGet主控台執下段命令,將為資料庫的所有Table建立相對應Model
參考來源:https://blog.talllkai.com/ASPNETCore/2021/04/13/DatabaseFirst
(2.2)圖形化工具
安裝 EF Core Power Tools:前往 「擴充功能 (Extensions)」 → 「管理擴充功能 (Manage Extensions),搜尋並安裝 「EF Core Power Tools」,重新啟動 Visual Studio
Models → 選擇 「新增 (Add)」 → 「新項目 (New Item)」→ 「資料 (Data)」 類別,然後選擇 「EF Core Database First Wizard」 → 選擇或建立DB連線 → 勾選要產生 Models 的資料表 → DbContext 的命名及其他選項 → 完成
參考來源:ChatGPT
(3)使用Scaffold
(3.1)在 Program.cs 中註冊 DbContext
(3.1)在 Controller按右鍵選新增Scaffold..... → 選EF檢視 → 選類別.選Context
(4)AD驗證
(4.1)改到 NuGet 安裝 System.DirectoryServices.Protocols、using System.DirectoryServices
(4.2)DirectoryEntry 要改指定 System.DirectoryServices.DirectoryEntry
(5)其他Identity相關登入驗證或權限
(5.1) SignInAsync 改成只有二個參數 signInManager.SignInAsync(user, isPersistent: false) , 且SignInAsync的user 要用 FindByIdAsync取得, 不可自己new
(5.2) UserManager.IsInRole 也改了, 不好用, 為防未來又變來變去, 決定採用最原始的DB讀寫AspNetUserRoles進行
(5.3)LoginTrd.cshtml 是由原本可運作的Login.cshtml 複製改名, 還要再改 LoginTrd.cshtml.cs的PageModel 類別名稱已修改為 LoginTrdModel, LoginTrd.cshtml 改 @LoginTrdModel
(5.4)帳號增加角色失敗,說不存RoleName,但資料庫明明有, await _userManager.AddToRoleAsync(user_new, RoleName); ,看來已以後還是依萬年不變的資料讀寫, identity變來變去, 意外太多
(9)安裝到IIS前置作業或各類注意事項
(9.1)安裝Boundle https://dotnet.microsoft.com/en-us/download/dotnet/8.0 或其他版本
(9.2)改web.config
(9.3)應用程式集區需獨立自己一個
(9.4)安裝在IIS 出現 HTTP ERROR 503, 應用程式集區回收, 再連
(9.5)IIS使用虛擬目錄(應用程式), 卻無法正常顯示 bi, 需修改 bootstrap-icons.css 內的字型路徑 url("/fonts/bootstrap......") => url("../fonts/bootstrap......")
(9.9)其他同 MVC 5
(9)自訂Scaffold 範本
(9)使用虛擬目錄(應用程式)
建議_Layout.cshtml的navbar的Home(首頁),改為純html固定href,可避免路由route誤解折首頁點了轉至未知頁面
技術交流列表
5.HttpClient(HttpContent)取回來的utf-8是亂碼