1. 程式人生 > >ASP.NET Core 2.0身份和角色管理入門

ASP.NET Core 2.0身份和角色管理入門

目錄

介紹

身份驗證和授權

身份驗證

授權

背景

先決條件

使用程式碼

第1步:建立資料庫

第2步:建立ASP.NET Core 

更新appsettings.json

步驟3:在Startup.cs檔案中新增Identity Service

第4步:註冊並建立您的第一個使用者

遷移

重新整理資料庫

第5步:建立角色併為角色分配使用者

第6步:建立管理頁面和設定授權

建立Admin控制器

設定授權

第7步:按使用者角色顯示隱藏選單


Download ASPNETCoreUserIdentity - 1.5 MB

  (建議按照文章自己先做)

介紹

在本文中,我們將詳細介紹如何在MVC應用程式中使用ASP.NET Core Identity來建立使用者角色並根據使用者角色顯示選單。

在這裡,我們將看到如何做:

  • 建立預設管理員使用者
  • 建立預設管理員角色
  • 將未經身份驗證的使用者重定向到登入頁面
  • 僅為授權管理員使用者顯示管理頁面選單

ASP.NET Identity允許我們為系統新增登入功能。在這個演示中,我們將使用SQL Server來儲存使用者詳細資訊和配置檔案資料。我們將使用ASP.NET Identity進行新使用者註冊,登入以及維護使用者配置檔案資料。如果我們談論登入,重要的部分是登入使用者是否經過身份驗證並且是否有權檢視頁面。

身份驗證和授權

身份驗證

檢查有效使用者。這裡的問題是如何檢查使用者是否有效。當用戶第一次訪問網站時,他/她將註冊該網站。他們所有的資訊,如使用者名稱,密碼,電子郵件等都將儲存在網站資料庫中。當用戶輸入他/她的使用者ID和密碼時,將使用資料庫檢查資訊。如果使用者輸入了與資料庫中相同的使用者ID和密碼,則他或她是有效使用者,並將被重定向到網站的主頁。如果使用者輸入的UserID或密碼與資料庫不匹配,則登入頁面將顯示一條訊息,例如請輸入有效的使用者名稱或密碼。檢查使用者是否有效訪問網站的整個過程稱為身份驗證 

授權

使用者通過身份驗證後,需要通過他/她的角色將其重定向到相應的頁面。例如,當管理員登入時,則需要重定向到管理頁面。如果會計師已登入,則需要將他

/她重定向到其帳目頁面。

背景

先決條件

確保已安裝計算機中的所有先決條件。如果沒有,那麼一個接一個地下載並安裝它們。

  1. 首先,從此連結下載並安裝Visual Studio 2017 
  2. SQL Server 2014或更高版本

使用程式碼

1步:建立資料庫

首先,我們將建立一個數據庫,並使用我們的新資料庫連線在appsettings.json  檔案中設定連線字串  DefaultConnection。我們將使用此資料庫建立ASP.NET Core Identity表。

建立資料庫:執行以下指令碼以建立我們的資料庫。 

USE MASTER 
GO

-- 1) Check for the Database Exists .If the database is exist then drop and create new DB
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'InventoryDB' )      
    DROP DATABASE InventoryDB  
GO      

CREATE DATABASE InventoryDB      
GO           

USE InventoryDB      
GO

執行資料庫指令碼後,我們可以看到已建立資料庫並且尚未建立表。

https://www.codeproject.com/KB/aspnet/1235077/4.PNG

2步:建立ASP.NET Core 

安裝Visual Studio 2017後,單擊開始,然後單擊程式,選擇“  Visual Studio 2017”——單擊“  Visual Studio 2017”。單擊New,然後單擊Project,選擇Web,然後選擇  ASP.NET Core Web Application。輸入您的專案名稱並單擊。

https://www.codeproject.com/KB/aspnet/1235077/1.PNG

選擇Web應用程式(模型-檢視-控制器),然後單擊更改身份驗證

https://www.codeproject.com/KB/aspnet/1235077/2.PNG

選擇個人使用者帳戶,然後單擊確定以建立專案。

https://www.codeproject.com/KB/aspnet/1235077/3.PNG

更新appsettings.json

appsettings.json檔案中,我們可以找到  DefaultConnection 連線字串。在連線字串中,更改你的SQL Server名稱,UIDPWD以在一個數據庫中建立和儲存所有使用者詳細資訊。 

"ConnectionStrings": {
    "DefaultConnection": "Server= YOURSERVERNAME;Database=InventoryDB;
     user id= YOURSQLUSERID;password=YOURSQLPASSWORD;Trusted_Connection=True;
     MultipleActiveResultSets=true"
  },

https://www.codeproject.com/KB/aspnet/1235077/5.PNG

步驟3:在Startup.cs檔案中新增Identity Service

預設情況下,在ASP.NET Core應用程式中,Identity Service將新增到Startup.cs檔案中的 ConfigureServices方法中。您還可以在使用者註冊時另外新增密碼強度,還可以使用以下程式碼設定預設登入頁/登出頁以及AccessDenaiedPath

services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            //Password Strength Setting
            services.Configure<IdentityOptions>(options =>
            {
                // Password settings
                options.Password.RequireDigit = true;
                options.Password.RequiredLength = 8;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = true;
                options.Password.RequireLowercase = false;
                options.Password.RequiredUniqueChars = 6;

                // Lockout settings
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
                options.Lockout.MaxFailedAccessAttempts = 10;
                options.Lockout.AllowedForNewUsers = true;

                // User settings
                options.User.RequireUniqueEmail = true;
            });

            //Setting the Account Login page
            services.ConfigureApplicationCookie(options =>
            {
                // Cookie settings
                options.Cookie.HttpOnly = true;
                options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                options.LoginPath = "/Account/Login"; // If the LoginPath is not set here,
                                                      // ASP.NET Core will default to /Account/Login
                options.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here,
                                                        // ASP.NET Core will default to /Account/Logout
                options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath is
                                                                    // not set here, ASP.NET Core
                                                                    // will default to
                                                                    // /Account/AccessDenied
                options.SlidingExpiration = true;
            });

下面是我們如何在ConfigureService方法中新增ASP.NET Core身份服務如下:

https://www.codeproject.com/KB/aspnet/1235077/5_1.PNG

4步:註冊並建立您的第一個使用者

現在,我們的ASP.NET Core Web應用程式已準備好供使用者在我們的網站上註冊,且使用者也可以在註冊後登入我們的系統。我們將通過在後續步驟中向用戶新增角色來執行授權。構建並執行應用程式以註冊您的第一個預設管理員使用者。

https://www.codeproject.com/KB/aspnet/1235077/6.PNG

單擊註冊連結註冊我們的第一個使用者。

https://www.codeproject.com/KB/aspnet/1235077/7.PNG

遷移

當我們點選註冊按鈕時,我們可以看到下面的頁面。不要對這個頁面感到恐慌,因為第一次執行我們需要進行遷移,只需單擊Apply Migrations按鈕。

https://www.codeproject.com/KB/aspnet/1235077/8.PNG

我們可以看到確認為已應用遷移,然後單擊嘗試重新整理頁面訊息

https://www.codeproject.com/KB/aspnet/1235077/9.PNG

重新整理頁面,我們可以看到新註冊的使用者已登入我們的網站。

https://www.codeproject.com/KB/aspnet/1235077/12.PNG

重新整理資料庫

重新整理資料庫時,我們可以看到所有的Identity表都已建立。

https://www.codeproject.com/KB/aspnet/1235077/10.PNG

我們可以檢查aspNetUsers表以查詢新建立的使用者詳細資訊。我們還可以看到ASPNetRoles並且ASPNetUserRoles沒有記錄,因為我們尚未為角色建立任何角色或新增使用者。在下一步中,我們將新增一個新角色為“ Admin,我們將新註冊使用者新增為Admin

https://www.codeproject.com/KB/aspnet/1235077/11.PNG

5步:建立角色併為角色分配使用者

我們使用以下方法建立一個新角色為“ Admin,我們將最近註冊的“ Admin” 分配給我們的網站。開啟Startup.cs檔案,並在你的Startup.cs檔案中新增以下方法。

        private async Task CreateUserRoles(IServiceProvider serviceProvider)
        {
            var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
            var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();

            IdentityResult roleResult;
            //Adding Admin Role
            var roleCheck = await RoleManager.RoleExistsAsync("Admin");
            if (!roleCheck)
            {
                //create the roles and seed them to the database
                roleResult = await RoleManager.CreateAsync(new IdentityRole("Admin"));
            }
 //Assign Admin role to the main User here we have given our newly registered
 //login id for Admin management
            ApplicationUser user = await UserManager.FindByEmailAsync("[email protected]");
            var User = new ApplicationUser();
            await UserManager.AddToRoleAsync(user, "Admin");
        }

Startup.cs檔案中,我們可以找到該Configure方法。從這個Configure方法呼叫我們的CreateUserRoles方法。當我們構建和執行應用程式時,我們可以看到在ASPNetRole表中將建立“Admin”的新角色 

https://www.codeproject.com/KB/aspnet/1235077/13.PNG

當我們構建並執行應用程式時,我們可以看到ASPNetRoles表中添加了新角色,並且我們可以看到我們的預設使用者已被分配了 Admin角色。

https://www.codeproject.com/KB/aspnet/1235077/14.PNG

6步:建立管理頁面和設定授權

現在我們有一個用於ASP.NET Core Web應用程式的Admin使用者。下一步,讓我們建立一個新頁面並將此頁面的授權設定為僅登入,僅管理員使用者可以檢視此頁面。為此,我們建立了一個新命命名為AdminController

建立Admin控制器

右鍵單擊Controller資料夾並單擊Add New Controller,選擇MVC Controller - Empty,然後單擊Add

https://www.codeproject.com/KB/aspnet/1235077/16.PNG

輸入您的Controller名稱為Admin,然後單擊Add

https://www.codeproject.com/KB/aspnet/1235077/17.PNG

在控制器中,右鍵單擊Index,然後單擊新增檢視。單擊新增按鈕以建立檢視頁面。

https://www.codeproject.com/KB/aspnet/1235077/18.PNG

我們可以看到我們的管理控制器和管理檢視已建立。

https://www.codeproject.com/KB/aspnet/1235077/19.PNG

開啟Admin / Index.cshtml頁面以根據需要進行設計。在這裡,我添加了如下的簡單文字:

https://www.codeproject.com/KB/aspnet/1235077/18.PNG

接下來,我們建立一個新選單以顯示Admin Page。要建立新選單,Views / Shared資料夾中開啟_Layout.cshtml。新增如下圖所示的選單:

https://www.codeproject.com/KB/aspnet/1235077/20.PNG

現在我們已經建立了管理頁面,併為管理員添加了選單。我們僅為Admin使用者建立了此頁面,其他使用者或未登入的使用者不應該看到此頁面。如果我們執行我們的應用程式會發生什麼。

我們可以看到新的選單Admin Page已經建立,現在對所有人開放。這意味著任何人都可以單擊該連結並檢視該頁面的內容。

https://www.codeproject.com/KB/aspnet/1235077/21.PNG

在這裡,我們可以看到,我們可以通過登入檢視管理頁面。

https://www.codeproject.com/KB/aspnet/1235077/22.PNG

設定授權

為避免這種情況,我們在管理頁面控制器中使用授權。開啟我們的 Admin控制器並新增以下程式碼行:

[Authorize(Roles = "Admin")]
public IActionResult Index()
{
    return View();
}

https://www.codeproject.com/KB/aspnet/1235077/23.PNG

如果我們執行我們的應用程式並單擊Admin Page,它將自動重定向到Log in頁面。

https://www.codeproject.com/KB/aspnet/1235077/24.PNG

請注意,只有管理員角色成員才能檢視管理頁面,因為我們僅為管理員角色設定了授權。如果您想新增更多角色,我們可以使用逗號,如下面的程式碼:

 [Authorize(Roles = "Admin,SuperAdmin,Manager")]

7步:按使用者角色顯示隱藏選單

現在讓我們更進一步的只顯示登入管理員使用者的管理員選單。為此,我們從Views / Shared資料夾下開啟Layout.cshtml並編輯新新增的選單,如下面的程式碼。在這個程式碼中,首先我們檢查使用者是否已經過身份驗證,意味著登入,然後我們檢查使用者是否具有檢視選單的授權。

<li>
     @if (User.Identity.IsAuthenticated)
      {
          @if (User.IsInRole("Admin"))
          {
             <a asp-area="" asp-controller="Admin" asp-action="Index">Admin Page</a>
          }
      }
 </li>

以下是我們的程式碼:

https://www.codeproject.com/KB/aspnet/1235077/25_0.PNG

執行應用程式,預設情況下我們可以看到Admin Page不會顯示在我們的頂層選單中。僅登入管理員角色使用者可以檢視選單。

https://www.codeproject.com/KB/aspnet/1235077/25.PNG

讓我們通過我們最初建立的管理員使用者登入來試試這個。

https://www.codeproject.com/KB/aspnet/1235077/26.PNG

登入後,我們可以看到管理員使用者現在可以檢視Admin Page選單。

https://www.codeproject.com/KB/aspnet/1235077/27.PNG

讓我們嘗試建立普通使用者,因為我們現在在註冊新使用者。

https://www.codeproject.com/KB/aspnet/1235077/28.PNG

註冊後,我們可以看到,對於這個使用者,我們沒有新增“Adminrdquorole,他無權檢視Admin Page

https://www.codeproject.com/KB/aspnet/1235077/29.PNG

參考連結:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?tabs=visual-studio%2Caspnetcore2x

 

原文地址:https://www.codeproject.com/Articles/1235077/Getting-Started-With-ASP-NET-Core-Identity-And-Rol