目錄
介紹
背景
先決條件
使用代碼
第1步 - 創建數據庫
創建數據庫
第2步 - 創建ASP.NET Core
更新appsettings.json
步驟3 - 在Startup.cs文件中添加Identity Service
第4步:注冊并創建用戶
刷新數據庫
第5步:創建角色并為角色分配用戶
第6步:創建Admin/Manager頁面并設置授權
步驟7:使用依賴注入進行菜單顯示
創建模型類
創建接口類
創建服務
注冊服務
在_Layout.cshtml頁面中注入服務
興趣點
Download source code - 2.2 MB
在開始閱讀本文之前,請仔細閱讀我之前的文章:ASP.NET Core 2.0身份和角色管理入門。
在我之前的文章中,我們已經詳細討論了如何在MVC應用程序中使用ASP.NET Core Identity來創建用戶角色并根據用戶角色顯示菜單。
在本文中,我們將詳細介紹如何在用戶登錄后顯示基于角色的動態菜單。為此,我們將創建一個Menu Master表并插入一些記錄以顯示菜單和鏈接到URL的菜單,這些菜單是基于登錄用戶的角色的。
在這里,我們將看到如何實現:
?
確保已在計算機上安裝了所有必備組件。如果沒有,那么一個接一個地下載并安裝它們。asp注入讓自己爆表、
?
這是我們上一篇文章的延續;?正如我們告訴你的那樣,我們將為ASP.NET?Identity表和我們自己的新表使用公共數據庫。
在我們之前的文章中,我們已經解釋了如何創建用戶角色,這里基于角色的菜單管理,我們需要在ASP.NET?Roles表和我們的menu表之間建立關系。
讓我們詳細了解如何創建Menu表,其于ASP.NET?Identity?中的AspNetRoles表是有關系的。
在這里,我們可以看到用于MenuMaster表的字段:
首先,我們將創建一個數據庫,并使用我們的新數據庫連接,在appsettings.json文件中設置連接字符串DefaultConnection。我們將使用此數據庫創建ASP.NET Core Identity表。
運行以下腳本以創建數據庫MenuMaster表和示例Menu插入行腳本。jsp注入、
USE MASTER??????
GO-- 1) Check for the Database Exists. If the database exists, then drop and create new DB??????
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'AttendanceDB' )??DROP DATABASE AttendanceDB;
GOCREATE DATABASE AttendanceDB;?????
GO--分割線,上面的先執行
USE AttendanceDB
GOIF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'MenuMaster' )???DROP TABLE MenuMaster;
GOCREATE TABLE MenuMaster???
(???MenuIdentity int identity(1,1),???MenuID VARCHAR(30)? NOT NULL,???MenuName VARCHAR(30)? NOT NULL,?Parent_MenuID? VARCHAR(30)? NOT NULL,?User_Roll [varchar](256) NOT NULL,??MenuFileName VARCHAR(100) NOT NULL,????MenuURL VARCHAR(500) NOT NULL,???USE_YN Char(1) DEFAULT 'Y',???CreatedDate datetime???CONSTRAINT [PK_MenuMaster] PRIMARY KEY CLUSTERED??(????????[MenuIdentity] ASC,???[MenuID] ASC,???[MenuName] ASC)WITH (PAD_INDEX? = OFF, STATISTICS_NORECOMPUTE? = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS? = ON, ALLOW_PAGE_LOCKS? = ON) ON [PRIMARY]???????
) ON [PRIMARY]select * from MenuMaster?-- Insert Admin User Details
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('AUSER','ADMIN Dashboard','*','ADMIN','INDEX','ADMINC','Y',getDate())?Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('AAbout','About Admin','*','ADMIN','INDEX','ADMINAC','Y',getDate())??Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('LStock','Live Stock','AUSER','ADMIN','INDEX','StockC','Y',getDate())????Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('Profile','User Details','AUSER','ADMIN','INDEX','MemberC','Y',getDate())??Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('MUSER','Manager Dashboard','*','ADMIN','INDEX','ManagerC','Y',getDate())?Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('MAbout','About Manager','*','ADMIN','INDEX','ManagerAC','Y',getDate())??Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('Accounts','Account Details','MUSER','ADMIN','INDEX','AccountC','Y',getDate())???Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('Inventory','Inventory Details','MUSER','ADMIN','INDEX','InventoryC','Y',getDate())?-- Insert Manager User Details
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('MUSER','Manager Dashboard','*','Manager','INDEX','ManagerC','Y',getDate())?Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('MAbout','About Manager','*','Manager','INDEX','ManagerAC','Y',getDate())??Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('Accounts','Account Details','MUSER','Manager','INDEX','AccountC','Y',getDate())????Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)Values('Inventory','Inventory Details','MUSER','Manager','INDEX','InventoryC','Y',getDate())??--分割線,上面的先執行
select * from MenuMaster;
--尚未遷移表,此時還沒有此表
select * from AspnetUserRoles;
在這里,我們可以在Menu Master表中看到我們使用的格式,以根據用戶角色插入顯示菜單的記錄。
在此演示應用程序中,當用戶單擊菜單時,我們已經有了所有需要的控制器和視圖。
安裝我們的Visual Studio 2017后,單擊開始,然后單擊程序并選擇Visual Studio 2017——單擊Visual Studio 2017。aspsql注入源碼、單擊新建,然后單擊項目,選擇Web,然后選擇ASP.NET Core Web Application。輸入您的項目名稱并單擊。
選擇Web Application (Model-View-Controller),然后單擊“更改身份驗證”。
選擇個人用戶帳戶,然后單擊確定以創建項目。
在appsettings.json文件中,我們可以找到DefaultConnection連接字符串。在連接字符串中,更改你的SQL Server名稱,UID和PWD以在一個數據庫中創建和存儲所有用戶詳細信息。asp注入是什么意思,
"ConnectionStrings": {?"DefaultConnection": "Server= YOURSERVERNAME;Database=InventoryDB;user id= YOURSQLUSERID;password=YOURSQLPASSWORD;Trusted_Connection=True;MultipleActiveResultSets=true"?},
默認情況下,在ASP.NET Core應用程序中,Identity Service將添加到Startup.cs文件中的 ConfigureServices方法中。您還可以在用戶注冊時另外添加密碼強度,還可以使用以下代碼設置默認登錄頁/注銷頁以及AccessDenaiedPath:
services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();//Password Strength Settingservices.Configure<IdentityOptions>(options =>{// Password settingsoptions.Password.RequireDigit = true;options.Password.RequiredLength = 8;options.Password.RequireNonAlphanumeric = false;options.Password.RequireUppercase = true;options.Password.RequireLowercase = false;options.Password.RequiredUniqueChars = 6;// Lockout settingsoptions.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);options.Lockout.MaxFailedAccessAttempts = 10;options.Lockout.AllowedForNewUsers = true;// User settingsoptions.User.RequireUniqueEmail = true;});//Setting the Account Login pageservices.ConfigureApplicationCookie(options =>{// Cookie settingsoptions.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/Loginoptions.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here,// ASP.NET Core will default to /Account/Logoutoptions.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath// is not set here, ASP.NET Core will default to /Account/AccessDeniedoptions.SlidingExpiration = true;});
現在,我們的ASP.NET Core Web應用程序已準備好供用戶在我們的網站上注冊,且用戶也可以在注冊后登錄我們的系統。我們將通過在后續步驟中向用戶添加角色來執行授權。構建并運行應用程序以注冊您的第一個默認管理員用戶。
在這里,我們將注冊兩個用戶,一個用戶為Admin而另一個用戶為Manager。我們將使用這些用戶來添加角色。aspaccess,我們將創建2個用戶syedshanumcain@gmail.com和afraz@gmail.com。注意:您可以根據需要創建用戶,并在啟動代碼中更改用戶詳細信息,以便向用戶添加角色。
刷新數據庫時,我們可以看到所有Identity表都已創建。
我們使用以下方法創建一個新角色“?Admin”和“?Manager”。我們會將最近注冊的用戶分配為“?Admin”和“?Manager”到我們的網站。打開Startup.cs文件,并在你的Startup.cs文件中添加此方法。asp.net core 3.0,
private async Task CreateUserRoles(IServiceProvider serviceProvider){var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();IdentityResult roleResult;//Adding Addmin 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"));}roleCheck = await RoleManager.RoleExistsAsync("Manager");if (!roleCheck){//create the roles and seed them to the database?roleResult = await RoleManager.CreateAsync(new IdentityRole("Manager"));}//Assign Admin role to the main User here we have given our//newly loregistered login id for Admin management?ApplicationUser user = await UserManager.FindByEmailAsync("syedshanumcain@gmail.com");var User = new ApplicationUser();await UserManager.AddToRoleAsync(user, "Admin");user = await UserManager.FindByEmailAsync("Afraz@gmail.com");await UserManager.AddToRoleAsync(user, "Manager");}
從Startup.cs文件中,我們可以找到該Configure方法。從這個Configure方法中調用我們的CreateUserRoles方法。當我們構建并運行我們的應用程序時,我們可以看到在ASPNetRole表中新的角色為“?Admin”和“?Manager”將創建。
現在我們為ASP.NET Core Web應用程序提供了一個Admin / Manager用戶作為下一步,讓我們創建基于用戶登錄顯示的控制器和視圖。在前面的示例中,我們已經了解了如何在每個頁面中設置角色授權,使用它,我們將創建所有需要的控制器和視圖。在附帶的示例演示應用程序中,您可以找到我們創建的所有控制器和視圖,并根據您的需要創建自己的控制器和視圖。php內置設計模式接口方法。
首先,我們將從Model文件夾中創建一個類開始。我們創建一個名為的MenuMaster類,其和數據庫中給出表名是完全相同的。在MenuMaster類中,我們需要創建和Table字段一樣名稱的屬性,如下:
public class MenuMaster{[Key]public int MenuIdentity { get; set; }public string MenuID { get; set; }public string MenuName { get; set; }public string Parent_MenuID { get; set; }public string User_Roll { get; set; }public string MenuFileName { get; set; }public string MenuURL { get; set; }public string USE_YN { get; set; }public DateTime CreatedDate { get; set; }}
現在,我們是時候創建一個帶有名稱為GetMenuMaster(),GetMenuMaster(String UserRole)的方法的接口,我們將在我們的服務中實現這個接口,以從表中獲取所有菜單細節,并且還使用另一個方法來根據用戶角色獲取菜單。要創建接口,請在model文件夾中添加一個新類,并將該類命名為“?IMenuMasterService”。
我們將把類更改為接口,因為我們將創建要在服務中實現的接口。
public interface IMenuMasterService{IEnumerable<MenuMaster> GetMenuMaster();IEnumerable<MenuMaster> GetMenuMaster(String UserRole);}
現在,讓我們添加一個新的Services類文件夾,并將該類命名為“?MenuMasterService”。asp實現防sql注入。在這個類中,我們將實現我們的接口 IMenuMasterService。我們知道如果我們實現了接口,那么我們應該在我們的類中聲明該接口方法。在此服務中,我們使用該接口方法,并返回包含Menu詳細信息的列表,和按用戶角色返回的Menu詳細信息。我們將直接在View頁面上注入此內容。
public class MenuMasterService:IMenuMasterService{private readonly ApplicationDbContext _dbContext;public MenuMasterService(ApplicationDbContext dbContext){_dbContext = dbContext;}public IEnumerable<MenuMaster> GetMenuMaster(){return _dbContext.MenuMaster.AsEnumerable();}public IEnumerable<MenuMaster> GetMenuMaster(string UserRole){?var result = _dbContext.MenuMaster.Where(m => m.User_Roll == UserRole).ToList();?return result;}}
我們需要將我們創建的服務注冊到容器中。從項目中打開Startup.cs以將服務添加到容器中。react構建用戶界面、
在Startup.cs類中,找到名為ConfigureServices的方法并添加您的服務“?MenuMasterService”,如下所示:
services.AddTransient<MenuMasterService, MenuMasterService>();
現在,它更加簡單和容易,因為我們可以直接在View頁面中注入服務并將所有結果綁定到我們的視圖頁面。要在我們的View中注入服務,這里我們將使用現有的_Layout.cshtml頁面。由于我們將在我們網站的頂部顯示菜單并在我們的所有頁面中使用,因此我們使用_Layout.cshtml頁面將菜單結果綁定為基于用戶登錄的菜單。
在這里,首先我們檢查用戶是否已通過我們的網站驗證,然后如果用戶已登錄,則我們獲取登錄用戶的角色詳細信息并根據用戶角色綁定菜單。在這里,我們將2級菜單綁定為主菜單和子菜單。在我們的表結果中,我們檢查所有的Parent_MenuID=” *” ,因為我們將帶有parent_MenuID是“?*”?的顯示為主菜單,在下一個內循環中,我們顯示對應主菜單的子菜單。apache管理員手冊、
<div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>@if (User.Identity.IsAuthenticated){var UserRoles = "";if (@User.IsInRole("Admin")){UserRoles = "Admin";}else{UserRoles = "Manager";}@if (menus.GetMenuMaster(@UserRoles).Any()){@if (menus.GetMenuMaster(@UserRoles).Any()){@foreach (var menuNames in menus.GetMenuMaster(@UserRoles).Where(n => n.Parent_MenuID == "*")){<li><a asp-area="" asp-controller=@menuNames.MenuURLasp-action=@menuNames.MenuFileName>@menuNames.MenuName</a><ul class="sub-menu">@foreach (var subMenu in menus.GetMenuMaster(@UserRoles).Where(n => n.Parent_MenuID == @menuNames.MenuID)){<li><a asp-area="" asp-controller=@subMenu.MenuURLasp-action=@subMenu.MenuFileName>@subMenu.MenuName</a></li>}</ul></li>}}}}</ul>
首先,AttendanceDB在SQL Server中創建一個示例數據庫,然后運行腳本來創建MenuMaster表并插入樣本記錄。在appsettings.json文件中,DefaultConnection使用SQL Server Connections?更改連接字符串。在Startup.cs文件中,添加我們在本文中討論的所有代碼。這是一個簡單的演示應用程序,我們已經固定了Admin和Manager角色,你可以根據你的要求進行更改,菜單和子菜單的CSS設計也不利于移動兼容性,你可以添加自己的bootstrap設計來實現你的菜單風格。希望大家都喜歡這篇文章。
?
原文地址:https://www.codeproject.com/Articles/1237650/ASP-NET-Core-User-Role-Base-Dynamic-Menu-Managemen
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态