2020年2月5日 星期三

ASP.NET Core - (DB-First) Scaffold-DbContext的錯誤訊息

在MVC課程中,有一段補充教材
把原本 ASP.NET MVC 5的範例,改用 ASP.NET Core專案來做,基本上大同小異。
唯獨 DB-First「資料庫連結(DB Connection)」的地方,需要自己下指令。

當初錄影時,是VS 2019 +.NET Core 2.x版
但我把範例重新在 .NET Core 3.1重做一次,都是正常的。請放心。

有位學員發生了錯誤,

(1)  Scaffold-DbContext : 無法辨識 'Scaffold-DbContext' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確認路徑是否正確,然後再試一次。
位於 線路:1 字元:1
+ Scaffold-DbContext 'Data Source=.\SqlExpress;Initial Catalog=xxxxxxx ...
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Scaffold-DbContext:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException



解決方法:

在VS 2019新增一個 ASP.NET Core 2.x 或 3.1專案後
務必先透過NuGet安裝兩個套件
-- 「Microsoft.EntityFrameworkCore.Tools」套件
-- 「Microsoft.EntityFrameworkCore.SqlServer」套件  註解:因為我用MS SQL Server來搭配

(課程中有講,如果您發生錯誤,可以先檢查一下,是不是自己漏了哪些步驟?     影片重播、回頭自己看一下,比對一下)




(2) Visual Studio 上方的功能列   「工具」 =>「Nuget套件管理器」=>「套件管理器主控台」
輸入指令  Scaffold-DbContext 'Server=.\sqlexpress;Database=xxxx' Microsoft.EntityFrameworkCore.SqlServer
出現這樣的錯誤:
A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared Memory Provider, error: 0 - 管道的另一端上無任何處理程序。)
與伺服器的連接已成功建立,但在登入程序時發生錯誤。 (provider: 共用記憶提供者, error: 0 - 管道的另一端上無任何處理程序。)

解決方法:

我上課使用的指令是
Scaffold-DbContext 'Server=.\sqlexpress;Database=資料庫名稱;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer

(課程中有講,如果您發生錯誤,可以先檢查一下,是不是自己漏了哪些步驟?     影片重播、回頭自己看一下,比對一下)

之前上課介紹的微軟文件,現在找不到了(可能改版或是刪除)
所以他找到類似的網頁,照著做,卻發生錯誤  https://docs.microsoft.com/zh-tw/ef/core/managing-schemas/scaffolding

我也找不到當初的官方文件了,比較類似的是這個網頁介紹 Code-First,請參閱 https://docs.microsoft.com/zh-tw/aspnet/core/data/ef-mvc/intro?view=aspnetcore-3.1



[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/mis2000lab_MVC_onlineLearning2023

[ASP.NET Core MVC]第一天 免費課程 3小時完整試聽

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/AspNetCore_MVC_First_Day_Free_20230130

從最早的 75小時MVC課程,目前已經延伸到 115小時,也包含了 .NET Core

.NET Core 6 MVC線上教學 - MIS2000Lab 課程大綱 與 試聽

https://dotblogs.com.tw/mis2000lab/2021/07/18/NET_MVC_Online_Free_Learning_mis2000lab 

購買完整MVC課程(一百小時),限時六折優惠並免費加贈兩萬元「.NET Core升級課程」,請直接來信洽詢

(太便宜!太划算,不能公開) mis2000lab (at) yahoo.com.tw ; school (at) mis2000lab.net

2020年2月4日 星期二

[會員登入] 不使用ASP.NET Core Identity 的 Cookie 驗證 (ClaimsIdentity)

ASP.NET Core 3.1與 2.x 搭配 System.Security.Claims 命名空間的 ClaimsIdentity來做

輕鬆簡單,很快就能上手。Forms Authentication with cookie


使用沒有 ASP.NET Core 身分識別的 cookie 驗證(不使用ASP.NET Core Identity的 cookie 驗證)


ASP.NET Core 3.1與 2.x ,搭配 System.Security.Claims 命名空間 的 ClaimsIdentity來做

我建議先閱讀這一篇文章,簡短有力,淺顯易懂。完成以後,再來看微軟官方說明。

(2018/8/2)  Forms Authentication in .NET Core (AKA Cookie Authentication)
http://www.nogginbox.co.uk/blog/forms-authentication-in-net-core-aka-cookie-authentication

或是參考我錄好的教學影片 - https://youtu.be/eRa-hdsDfB4

微軟的文件(中文) .NET Core 2.1與 3.1差異不大。

但 3.1版的範例採用 Razor Page來示範。
https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/security/authentication/cookie/samples/3.x/CookieSample

每一個檢視畫面(網頁)跟以前WebForm(.aspx)一樣,分成兩個檔案(.cshtml 與 .cshtml.cs)。

我覺得比較不好懂。所以建議參閱 .NET Core 2.1的範例。
https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/security/authentication/cookie/samples/2.x/CookieSample

** 步驟如下 **

第一,打開一個 ASP.NET Core 的 MVC專案

第二,透過 Nuget安裝「Microsoft.AspNetCore.Authentication.Cookies


第三,Startup.cs裡面有些設定:
請參閱  https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/security/authentication/cookie/samples/3.x/CookieSample/Startup.cs

(3-1) ConfigureServices這個區域,請加入這兩段
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
           .AddCookie();

         

(3-2) Configure這個區域,請加入這兩段
            app.UseAuthentication();   // 這一句話需要手動加入,後面幾句是原本就有的
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                // endpoints.MapRazorPages();   // 如果您不使用 RazorPage來做,這一句可以註解掉、不用
            });




第四,HomeController控制器,您需要加入這些命名空間

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using System.Security.Claims;    // Claims會用到
using Microsoft.AspNetCore.Authorization;  


(4-1) Login登入,輸入帳號、密碼。
        public IActionResult Login()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken] 
        public ActionResult Login(db_user _User)
        {
            if (ModelState.IsValid)
            {   // 入門版,先不連結DB,固定帳號密碼來做(微軟範例也是這樣)
                //
線上課程 裡會有連結資料庫,比對帳號與密碼的教材。  初學者不要急,一步一步學習。
                if (_User.UserName != "123" && _User.UserPassword != "123")
                {
                    ViewData["ErrorMessage"] = "帳號與密碼有錯";
                    return View();
                }
                #region ***** 不使用ASP.NET Core Identity的 cookie 驗證 *****
                var claims = new List   // 搭配 System.Security.Claims; 命名空間
                {
                    new Claim(ClaimTypes.Name, _User.UserName),
                    // new Claim(ClaimTypes.Role, "Administrator"),
                    // 如果要有「群組、角色、權限」,可以加入這一段

                };

                // 底下的 ** 登入 Login ** 需要下面兩個參數 (1) claimsIdentity  (2) authProperties
                var claimsIdentity = new ClaimsIdentity(
                                           claims, CookieAuthenticationDefaults.AuthenticationScheme);
                var authProperties = new AuthenticationProperties
                {
                    //AllowRefresh = ,
                    // Refreshing the authentication session should be allowed.

                    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), 
                    // The time at which the authentication ticket expires. A
                    // value set here overrides the ExpireTimeSpan option of
                    // CookieAuthenticationOptions set with AddCookie.

                    //IsPersistent = true,
                    // Whether the authentication session is persisted across
                    // multiple requests. When used with cookies, controls
                    // whether the cookie's lifetime is absolute (matching the
                    // lifetime of the authentication ticket) or session-based.

                    //IssuedUtc = ,
                    // The time at which the authentication ticket was issued.

                    //RedirectUri =
                    // The full path or absolute URI to be used as an http redirect response value.

                };
                // *** 登入 Login *********
                HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
                                                        new ClaimsPrincipal(claimsIdentity),
                                                        authProperties);
                #endregion
                return Content("

恭喜您,登入成功

");
            }
            // Something failed. Redisplay the form.
            return View();
        }

(4-2) LogOut 登出。微軟範例以非同步(異步)的寫法來做 -- Async. Await
可以參閱這一則影片  https://youtu.be/8vcrjhaF1zE   ( [ASP.NET].NET 4.5 非同步程式,從一張圖知道原來如此 (async & await) )
        public async Task Logout()
        {
            // 自己宣告 Microsoft.AspNetCore.Authentication.Cookies; 命名空間
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            return View();  // 回 首頁。 return RedirectToAction("Index", "Home");
        }


** 範例下載 **

    我整理了一份 "PDF檔" 當作說明,也分享了這個範例

    專案名為 WebApplication2019_MVC_Core_LoginCookie

    這個範例為了搭配我的MVC課程,所以經過修改。
    已經購買 ASP.NET MVC 5線上教學的朋友,可以發現跟原本範例的差異不大
    主要是上述(第四部分)的修改而已。

請由此下載  https://onedrive.live.com/?id=6F7F668080F24B20%212586&cid=6F7F668080F24B20

***************************************************

[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/mis2000lab_MVC_onlineLearning2023

[ASP.NET Core MVC]第一天 免費課程 3小時完整試聽

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/AspNetCore_MVC_First_Day_Free_20230130

從最早的 75小時MVC課程,目前已經延伸到 115小時,也包含了 .NET Core

.NET Core 6 MVC線上教學 - MIS2000Lab 課程大綱 與 試聽

https://dotblogs.com.tw/mis2000lab/2021/07/18/NET_MVC_Online_Free_Learning_mis2000lab 

購買完整MVC課程(一百小時),限時六折優惠並免費加贈兩萬元「.NET Core升級課程」,請直接來信洽詢

(太便宜!太划算,不能公開) mis2000lab (at) yahoo.com.tw ; school (at) mis2000lab.net