asp注入讓自己爆表,使用依賴注入的ASP.NET Core 2.0用戶角色基礎動態菜單管理

 2023-10-01 阅读 21 评论 0

摘要:目錄 介紹 背景 先決條件 使用代碼 第1步 - 創建數據庫 創建數據庫 第2步 - 創建ASP.NET Core 更新appsettings.json 步驟3 - 在Startup.cs文件中添加Identity Service 第4步:注冊并創建用戶 刷新數據庫 第5步:創建角色并為角色分配用戶 第6步:創建Admin

目錄

介紹

背景

先決條件

使用代碼

第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

介紹

https://www.codeproject.com/KB/aspnet/1237650/ASPDynamicMenu.gif

在開始閱讀本文之前,請仔細閱讀我之前的文章:ASP.NET Core 2.0身份和角色管理入門

在我之前的文章中,我們已經詳細討論了如何在MVC應用程序中使用ASP.NET Core Identity來創建用戶角色并根據用戶角色顯示菜單。

在本文中,我們將詳細介紹如何在用戶登錄后顯示基于角色的動態菜單。為此,我們將創建一個Menu Master表并插入一些記錄以顯示菜單和鏈接到URL的菜單,這些菜單是基于登錄用戶的角色的。

在這里,我們將看到如何實現:

  • 創建默認管理員和經理用戶
  • 創建MenuMaster表并插入一些示例記錄為AdminManager角色以顯示菜單
  • 將未經身份驗證的用戶重定向到登錄頁面
  • 根據登錄用戶動態顯示菜單

?

背景

先決條件

確保已在計算機上安裝了所有必備組件。如果沒有,那么一個接一個地下載并安裝它們。asp注入讓自己爆表、

  1. 首先,從此鏈接下載并安裝Visual Studio 2017
  2. SQL Server 2014或更高版本

?

使用代碼

1 - 創建數據庫

這是我們上一篇文章的延續;?正如我們告訴你的那樣,我們將為ASP.NET?Identity表和我們自己的新表使用公共數據庫。

在我們之前的文章中,我們已經解釋了如何創建用戶角色,這里基于角色的菜單管理,我們需要在ASP.NET?Roles表和我們的menu表之間建立關系。

讓我們詳細了解如何創建Menu表,其于ASP.NET?Identity?中的AspNetRoles表是有關系的。

在這里,我們可以看到用于MenuMaster表的字段:

https://www.codeproject.com/KB/aspnet/1237650/0.PNG

首先,我們將創建一個數據庫,并使用我們的新數據庫連接,在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表中看到我們使用的格式,以根據用戶角色插入顯示菜單的記錄。

  • MenuID = 'AUSER'?(我們將提供獨特的菜單ID)。
  • MenuName = 'ADMIN Dashboard'?(我們將提供菜單顯示文字),
  • Parent_MenuID = '*’(如果這是主菜單,那么我們將在此處給出“?*,否則我們將給出之前的記錄MenuID以顯示此記錄以顯示為子菜單)。
  • User_Roll = 'ADMIN'(在這里,我們會給出用戶角色,如果同樣的菜單需要被用于基于像AdminManagerAccountant等等這樣用戶的多個角色,那么我們將使用不同的用戶角色插入相同的菜單的詳細信息。在我們的示例中,我們為AdminManager用戶添加了與“Manager Dashboard”相同的菜單細節,因為兩者都可以查看菜單和頁面。)。java比net core性能好、
  • MenuFileName = 'INDEX'(這里,在單擊菜單時顯示我們給出的View名字)。
  • MenuURL = 'ADMINC'(這里,在單擊菜單時顯示我們給出的Controller名字)。
  • USE_YN = 'Y'?(這是一個可選字段,因為我們可以使用它來顯示菜單或不顯示)。
  • CreatedDate = getDate()?(這也是輸入創建日期的可選項)。

在此演示應用程序中,當用戶單擊菜單時,我們已經有了所有需要的控制器和視圖。

2 - 創建ASP.NET Core

安裝我們的Visual Studio 2017后,單擊開始,然后單擊程序并選擇Visual Studio 2017——單擊Visual Studio 2017。aspsql注入源碼、單擊新建,然后單擊項目,選擇Web,然后選擇ASP.NET Core Web Application。輸入您的項目名稱并單擊。

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

選擇Web Application (Model-View-Controller),然后單擊更改身份驗證

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

選擇個人用戶帳戶,然后單擊確定以創建項目。

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

更新appsettings.json

appsettings.json文件中,我們可以找到DefaultConnection連接字符串。在連接字符串中,更改你的SQL Server名稱,UIDPWD以在一個數據庫中創建和存儲所有用戶詳細信息。asp注入是什么意思,

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

步驟3 - Startup.cs文件中添加Identity Service

默認情況下,在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;});

4步:注冊并創建用戶

現在,我們的ASP.NET Core Web應用程序已準備好供用戶在我們的網站上注冊,且用戶也可以在注冊后登錄我們的系統。我們將通過在后續步驟中向用戶添加角色來執行授權。構建并運行應用程序以注冊您的第一個默認管理員用戶。

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

在這里,我們將注冊兩個用戶,一個用戶為Admin而另一個用戶為Manager。我們將使用這些用戶來添加角色。aspaccess,我們將創建2個用戶syedshanumcain@gmail.comafraz@gmail.com注意:您可以根據需要創建用戶,并在啟動代碼中更改用戶詳細信息,以便向用戶添加角色。

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

刷新數據庫

刷新數據庫時,我們可以看到所有Identity表都已創建。

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

5步:創建角色并為角色分配用戶

我們使用以下方法創建一個新角色“?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將創建。

6步:創建Admin/Manager頁面并設置授權

現在我們為ASP.NET Core Web應用程序提供了一個Admin / Manager用戶作為下一步,讓我們創建基于用戶登錄顯示的控制器和視圖。在前面的示例中,我們已經了解了如何在每個頁面中設置角色授權,使用它,我們將創建所有需要的控制器和視圖。在附帶的示例演示應用程序中,您可以找到我們創建的所有控制器和視圖,并根據您的需要創建自己的控制器和視圖。php內置設計模式接口方法。

步驟7:使用依賴注入進行菜單顯示

創建模型類

首先,我們將從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>();

_Layout.cshtml頁面中注入服務

現在,它更加簡單和容易,因為我們可以直接在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>

https://www.codeproject.com/KB/aspnet/1237650/Animation_1.gif

興趣點

首先,AttendanceDBSQL Server中創建一個示例數據庫,然后運行腳本來創建MenuMaster表并插入樣本記錄。在appsettings.json文件中,DefaultConnection使用SQL Server Connections?更改連接字符串。在Startup.cs文件中,添加我們在本文中討論的所有代碼。這是一個簡單的演示應用程序,我們已經固定了AdminManager角色,你可以根據你的要求進行更改,菜單和子菜單的CSS設計也不利于移動兼容性,你可以添加自己的bootstrap設計來實現你的菜單風格。希望大家都喜歡這篇文章。

?

原文地址:https://www.codeproject.com/Articles/1237650/ASP-NET-Core-User-Role-Base-Dynamic-Menu-Managemen

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/108279.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息