環境與版本

作業系統:Window10 64x 版本:2004

開發軟件(IDE):Visual Studio 2019 Community

.NET版本:ASP.NET Core 3.1

專案架構:MVC

範本參考

建立具有驗證的 Web 應用程式

ASP.NET Core Identity:

  • 是支援使用者介面 (UI) 登入功能的 API。
  • 管理使用者、密碼、設定檔資料、角色、宣告、權杖、電子郵件確認等等。

使用者可以建立具有儲存在中之登入資訊的帳戶, Identity 或可以使用外部登入提供者。 支援的外部登入提供者包括Facebook、Google、Microsoft 帳戶及 Twitter。

  • 選取 [ 檔案] [ > 新增 > 專案]。
  • 選取 ASP.NET Core Web 應用程式。 將專案命名為WebApp1 ,使其命名空間與專案下載相同。 按一下 [確定] 。
  • 選取 ASP.NET Core Web 應用程式,然後選取 [變更驗證]。
  • 選取 [個別使用者帳戶],然後按一下 [確定]。

Data/Migration 是Model到Database間整合的中介模組,這裏,用來在資枓庫建置出存放驗證資料的相關資料表的模組。

Data/ApplicationDbContext.cs 為 ASP.NET Identity 搭配的 Entity Framework 資料物件 Data/Migrations 下兩個檔案用於定義 ASP.NET Identity 所需 SQL 資料庫的 Schema 資訊。

Areas/Identity/Pages 為會員管理相關介面,但只剩 _ViewStart.cshtml 可以微調版面,註冊新會員、帳號登入、修改密碼、忘記密碼等介面數十個 Razor Page cshtml 在 ASP.NET Core 2.1 後被收納到 Microsoft.AspNetCore.Identity.UI NuGet 程式庫。(如有特殊客製需求 有方式修改,但需留意調整不當將導致功能異常或影響資安。

套用移轉

ASP.NET CORE identity是code first的方式進行的,所以一開始需要套用Migration的方式來初始化資料庫。 在[套件管理器主控台]使用以下語法進行Code First 將程式碼轉移到資料庫。

PM> Update-Database

※因為是code first的方式,所以許多公司在考量使用的時候,需要多注意這塊,如果客製化需求大的專案,例如一些政府單位的案子,可能使用這種方式的話,需要修改的地方會非常多。

查看身分識別資料庫

ASP.NET Identity 預設使用 SQL Server Express LocalDB

有興趣實作雙因認證,可以參考文章使用 ASP.NET Core 中的 SMS 的雙因素驗證試看看。

設定 Identity 服務

加入 ConfigureServices。

設定的意義,註記在程式裏了

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
     // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
  
//複製以下行數
services.Configure<IdentityOptions>(options =>
            {
                // Password settings.
                options.Password.RequireDigit = true;               //密碼要有數字
                options.Password.RequireLowercase = true;           //要有小寫英文字母
                options.Password.RequireNonAlphanumeric = false;    //不需要符號字元
                options.Password.RequireUppercase = true;           //要有大寫英文字母
                options.Password.RequiredLength = 6;                //密碼至少要6個字元長
                options.Password.RequiredUniqueChars = 1;           //至少要有1個字元不一樣

                // Lockout settings.
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); //5分鐘沒有動靜就自動鎖住定網站,預設5分鐘
                options.Lockout.MaxFailedAccessAttempts = 5; //三次密碼誤就鎖定網站, 預設5次
                options.Lockout.AllowedForNewUsers = true; //新增的使用者也會被鎖定,就是犯規沒有新人優待

                // User settings.
                options.User.AllowedUserNameCharacters =
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
                options.User.RequireUniqueEmail = true; //郵箱不能重覆使用
            });

            services.ConfigureApplicationCookie(options =>
            {
                // Cookie settings
                options.Cookie.HttpOnly = true;
                options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

                options.LoginPath = "/Identity/Account/Login"; //登入頁
                options.AccessDeniedPath = "/Identity/Account/AccessDenied";//登出Action
                options.SlidingExpiration = true;
            });
  //複製以上行數
}

Identity藉由呼叫來啟用 UseAuthentication 。

UseAuthentication會將驗證中介軟體新增。

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication(); //Identity藉由呼叫來啟用 UseAuthentication 。 UseAuthentication將驗證中介軟體新增至要求管線。
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });
        }

直接執行嘗試看看

也可以直接嘗試註冊看看,範本配置已經相當齊全

Scaffold Register、Login、登出和 RegisterConfirmation

.NET Core 2.1 以後,因為許多cshtml 都被收納了,所以我們要使用Scaffold 的方式建立出新的出來.

使用Scaffold 的方式建立出來。

因為是範本檔,我們就直接全部勾選並新增上來

可以看到全部的頁面和後端城市都建立起來了,值得注意的是,他是直接分前後端,前端部分使用.cshtml,後端部分就是使用.cs,這樣的方式非常像微軟早期網頁主力WebForm的建構方式。

參考或引用資料來源:

簡介 Identity ASP.NET Core:https://docs.microsoft.com/zh-tw/aspnet/core/security/authentication/identity?view=aspnetcore-3.1&tabs=visual-studio

(Day 18) ASP.NET Core的驗證機制 – 上篇:https://ithelp.ithome.com.tw/articles/10204475

ASP.NET Core 3.0 登入機制實作(claims-based authentication):http://ikevin.tw/2019/08/10/asp-net-core-3-0-%E7%99%BB%E5%85%A5%E6%A9%9F%E5%88%B6%E5%AF%A6%E4%BD%9Cclaims-based-authentication/

[Day 25] 用ASP.NET MVC 做簡單的註冊及登入系統(一):https://ithelp.ithome.com.tw/articles/10195671

[會員登入] 不使用ASP.NET Core Identity 的 Cookie 驗證 (ClaimsIdentity):https://dotblogs.com.tw/mis2000lab/2020/02/14/AspNet_Core_Authentication_cookie_ClaimsIdentity

小試 ASP.NET Core Identity:https://blog.darkthread.net/blog/aspnetcore-identity/

人生記事本 @kevin的日記:https://dotblogs.azurewebsites.net/Kevin_Date/Tags?qq=Identity

Steven玄

謝謝您觀看本站內容!! 😅 西元93年台灣男,軟體前、後、資料庫工程師 和 多元收入實踐,程式設計、網站系統規劃、商業策略分析規劃、多元收入研究,目前在網站開發公司擔任工程師。

發佈留言