今天要用 .NET Core 自帶的使用者管理套件 Identity
來實現網站的會員功能
ASP.NET Core Identity 是 .NET Core 支援使用者介面 (UI) 登入功能的 API。提供管理使用者、密碼、設定檔資料、角色、宣告、權杖、電子郵件確認等。使用者可以使用儲存在中的登入資訊來建立帳戶,也可以使用外部登入提供者。
用 Scaffold 把 Identity 程式碼載入專案
建立並使用 DbContext OnlineShopUserContext
和 使用者類別 OnlineShopUser
加入了程式碼還不夠,還需要向程式註冊相關服務
打開組態檔Startup.cs
在 Configure
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
在 _layout.cshtml
的 navbar 加上這行
<partial name="_LoginPartial" />
這樣一來就可以看到右上角出現登入和註冊的標示了
但這時候註冊使用者仍會發生錯誤,這是因為資料庫還沒有把資料表建立好
appsetting.json
把 ConnectionString
改成我們的 OnlineShop資料庫
"OnlineShopUserContextConnection": "Data Source=DESKTOP-E22K0FS\\SQLEXPRESS;Initial Catalog=OnlineShop;Integrated Security=True"
接下來跟之前一樣執行資料庫移轉Add-Migration InitialIdentity -Context OnlineShopUserContext
Update-Database -Context OnlineShopUserContext
在ssms就可以看到資料表了
到這裡會員的基本功能就建好囉!
資料庫移轉的語法有錯嗎?
會一直要求填入Name參數,即便填入了,最後一直出現:
Value cannot be null.
Parameter name: connectionString
還在找原因中,不知您那兒有何建議?
你可以試試看用InitialIdentity
來作為這次移轉的名稱
( 也可以自己取沒關係,Name參數通常只是拿來標記這次更動了什麼東西 )
Add-Migration InitialIdentity -Context OnlineShopUserContext
第二個問題
你可能需要確定 Identity 指定的 ConnectionString 有被定義Areas/Identity/IdentityHostingStartup.cs
services.AddDbContext<OnlineShopUserContext>(options =>
options.UseSqlServer(
context.Configuration.GetConnectionString("OnlineShopUserContext")));
appsettings.json
"ConnectionStrings": {
"OnlineShopContext": "xxx",
"OnlineShopUserContext": "xxx"
}
執行後結果一樣,appsettings.json內只能有一組字串,不然會出現重複的TContext:
GenericArguments[0], 'OnlineShopCMS.Migrations.OnlineShopUser.OnlineShopUserContext', on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.
後來發現是我開發工具用的是VS2017,core版本太舊(2.1),後來就改用2019的(5.0),就正常了...
想請問在使用Identity建置會一直產生錯誤,無法辨識 'Scaffold-DbContext' ,是DB連結問題嗎