築夢園資訊科技
築夢園資訊科技

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誤解折首頁點了轉至未知頁面

技術交流列表

1.微軟WINDOWS重大更新後,微軟倉頡無法選字

2.MVC 5 要如何讀取資料庫檢視表的資料

3.MVC系統建置失敗

4.IDAutomationHC39M字型安裝或啟用失敗

5.HttpClient(HttpContent)取回來的utf-8是亂碼

6.ASP.NET MVC 升級至 ASP.NET Core MVC 全記錄

7.HTML已加audio,但chrome為什麼不能自動播放音樂?

築夢園資訊科技
築夢園資訊科技 築夢園資訊科技
總公司:高雄市楠梓區右昌街143巷30弄15號
台北辦:新北市中和區景平路634-19號3樓
電話:(02)2246-3982 (07)362-2675
手機:0936-865-686 蔡
Email:guanii@mydream.com.tw

COPYRIGHT © ALL RIGHTS RESERVED.