ASP。使用依赖注入的asp.net Core 2.0用户角色库动态菜单管理

时间:2022-09-07 14:25:29

介绍 在开始这篇文章之前,请阅读我的前一篇文章: 开始使用ASP。NET Core 2.0身份和角色管理 在上一篇文章中,我们详细讨论了如何使用ASP。NET Core Identity在MVC应用程序中用于创建用户角色和根据用户角色显示菜单。 在本文中,我们将详细了解如何在用户登录后显示基于角色的动态菜单。为此,我们将创建一个菜单主表,并插入一些记录来显示菜单,并根据登录用户的角色将URL链接到菜单。 下面,我们来看看如何: 创建默认的admin和manager用户创建MenuMaster表,并为admin和manager角色插入一些示例记录,以显示菜单,根据登录用户动态将未经身份验证的用户重定向到登录页面显示菜单 背景 先决条件 确保已在计算机上安装了所有先决条件。如果没有,那么下载并安装它们,一个一个。 首先,从这个链接sql Server 2014或以上下载并安装Visual Studio 2017 使用的代码 步骤1 -创建一个数据库 这是我们上一篇文章的延续;正如我们已经告诉你的,我们将为两个ASP使用一个公共数据库。NET标识表和我们自己的新表。 在上一篇文章中,我们已经解释了如何创建用户角色,在这里,对于基于角色的菜单管理,我们需要在ASP之间创建一个关系表。NET Roles表和我们的菜单表。 让我们详细看看如何创建与ASP有关系的新菜单表。NET身份AspNetRoles表。 在这里,我们可以看到MenuMaster使用的字段: 首先,我们将创建一个数据库,并在appsettings中设置连接字符串。json文件DefaultConnection与我们的新数据库连接。我们将使用这个数据库的ASP。NET Core标识表创建。 创建数据库 运行以下脚本创建数据库MenuMaster表和示例菜单插入行脚本。 隐藏,收缩,复制Code

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
GO CREATE DATABASE AttendanceDB
GO USE AttendanceDB
GO IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'MenuMaster' )
DROP TABLE MenuMaster
GO CREATE 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

在这里,我们可以看到我们在菜单主表中使用的格式,该格式用于根据用户角色插入显示菜单的记录。 MenuID = 'AUSER'(我们将提供唯一的菜单ID)。MenuName = 'ADMIN Dashboard'(我们将给出菜单显示文本),parent_menuid = '* '(如果这是主菜单,那么我们将在这里给出“*”,否则我们将给出以前记录的MenuID,以显示这条记录作为子菜单显示)。User_Roll = 'ADMIN'(在这里,我们将给出用户角色,如果需要为基于ADMIN、Manager、accounting等多个角色的用户使用相同的菜单,那么我们将为不同的用户角色插入相同的菜单细节。在我们的示例中,我们为管理员和管理员用户都添加了与“管理仪表板”相同的菜单细节,因为他们都可以查看菜单和页面。MenuFileName = 'INDEX'(这里,我们给出了当单击菜单时显示的视图名称)。MenuURL = 'ADMINC'(在这里,我们给出了当单击菜单时显示的控制器名称)。USE_YN = 'Y'(这是一个可选字段,我们可以使用它来显示菜单或不显示)。CreatedDate = getDate()(对于输入创建日期,这也是可选的)。 在这个演示应用程序中,当用户点击菜单时,我们已经有了所有需要的控制器和视图。 步骤2 -创建您的ASP。网络核心 安装Visual Studio 2017之后,单击“开始”,然后单击“程序”并选择Visual Studio 2017——单击Visual Studio 2017。单击New,然后选择Project,选择Web,然后选择ASP。NET Core Web应用程序。输入项目名称并单击。 选择Web应用程序(模型-视图-控制器)并单击更改身份验证。 选择单个用户帐户并单击ok创建项目。 更新appsettings.json 在appsettings。json文件,我们可以找到DefaultConnection连接字符串。这里,在连接字符串中,更改SQL服务器名称、UID和PWD,以便在一个数据库中创建和存储所有用户详细信息。 隐藏,复制Code

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

步骤3 -在Startup.cs文件中添加身份服务 默认情况下,在您的ASP中。在asp.net Core应用程序中,身份识别服务将被添加到start .cs file /ConfigureServices方法中。您也可以另外添加密码强度,而用户注册,也可以设置默认的登录页/登出页,也AccessDeniedPath使用以下代码: 隐藏,收缩,复制Code

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;
});

步骤4:注册和创建用户 现在我们的ASP。NET Core web应用程序已经为用户在我们的网站注册做好了准备,用户注册后也可以登录到我们的系统。在接下来的步骤中,我们将通过将role添加到user来进行授权。构建并运行应用程序以注册第一个默认管理用户。 在这里,我们将注册两个用户,一个为Admin,另一个为Manager。我们将使用这些用户来添加角色。我们将创建两个用户,syedshanumcain@gmail.com和afraz@gmail.com。注意:您可以创建并在启动代码中更改用户详细信息,以便向用户添加角色。 刷新数据库 当刷新数据库时,可以看到所有标识表都已创建。 步骤5:创建角色并为角色分配用户 我们使用下面的方法创建一个新角色,即“Admin”和“Manager”。我们将分配最近注册的用户作为“管理”和“经理”到我们的网站。打开Startup.cs文件并将此方法添加到你的Startup.cs文件中。 隐藏,收缩,复制Code

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");
}

在start .cs文件中,我们可以找到Configure方法。从这个配置方法调用我们的CreateUserRoles方法。当我们构建和运行我们的应用程序时,我们可以看到新的角色,如“Admin”和“Manager”将在ASPNetRole表中创建。 步骤6:创建Admin/Manager页面并设置授权 现在我们有了一个管理/管理用户的ASP。下一步,让我们创建控制器和视图来显示基于用户登录。在前面的示例中,我们已经看到了如何为每个页面中的角色设置授权,使用它,我们将创建所有需要的控制器和视图。在附呈的样例演示应用程序中,你可以找到我们已经创建的所有控制器和视图,并根据你的需要创建自己的。 第7步:使用依赖注入来显示菜单 创建模型类 首先,我们将在模型文件夹中创建一个类。我们将类名命名为MenuMaster,与数据库中的表名相同。在MenuMaster类中,我们需要创建和我们的表格字段一样的属性,如下图所示: 隐藏,复制Code

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(字符串UserRole)的方法创建一个接口了,我们将在服务中实现这个接口,以便从表中获取所有菜单细节,还可以使用另一个方法根据用户角色获取菜单。为了创建接口,在模型文件夹中添加一个新类,并将其命名为“IMenuMasterService”。 我们将把类更改为接口,因为我们要创建一个接口来在服务中实现它。 隐藏,复制Code

public interface IMenuMasterService
{
IEnumerable<MenuMaster> GetMenuMaster();
IEnumerable<MenuMaster> GetMenuMaster(String UserRole);
}

创建服务 现在,让我们添加一个新的类服务文件夹,并将这个类命名为“MenuMasterService”。在这个类中,我们将实现接口IMenuMasterService。我们知道,如果实现了接口,那么应该在类中声明接口方法。在此服务中,我们使用接口方法,并返回带有菜单详细信息的列表,还按用户角色返回菜单详细信息。我们将直接将其注入到视图页面中。 隐藏,复制Code

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,将服务添加到容器中。 在Startup.cs类中,找到名为ConfigureServices的方法,并添加您的服务“MenuMasterService”,如下所示: 隐藏,复制Code

services.AddTransient<MenuMasterService, MenuMasterService>();

将服务注入到_Layout中。cshtml页面 现在,它更简单更容易,因为我们可以直接在视图页面中注入服务,并将所有结果绑定到我们的视图页面。为了在视图中注入服务,这里我们将使用现有的_Layout。cshtml页面。因为我们将在网站的顶部显示菜单并在所有页面中使用,所以这里我们使用了_Layout。cshtml页面将菜单结果绑定为基于用户登录的菜单。 在这里,我们首先检查用户是否通过我们的网站身份验证,然后如果用户已经登录,那么我们将获得登录用户的角色详细信息,并根据用户角色绑定菜单。在这里,我们绑定了2个层次的菜单作为主菜单和子菜单。在我们的表结果中,我们检查所有的Parent_MenuID= " * ",因为我们将以Parent_MenuID为" * "来显示主菜单,在接下来的内部循环中,我们将显示适合于主菜单的子菜单。 隐藏,收缩,复制Code

<divclass="navbar-collapse collapse">
<ulclass="nav navbar-nav">
<li><aasp-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>
<aasp-area=""asp-controller=@menuNames.MenuURL asp-action=@menuNames.MenuFileName>@menuNames.MenuName</a>
<ulclass="sub-menu">
@foreach (var subMenu in menus.GetMenuMaster(@UserRoles).Where
(n => n.Parent_MenuID == @menuNames.MenuID))
{
<li>
<aasp-area=""asp-controller=@subMenu.MenuURL asp-action=@subMenu.MenuFileName>@subMenu.MenuName</a>
</li>
}
</ul>
</li>
}
}
}
}
</ul>

的兴趣点 首先,在SQL服务器中创建一个示例AttendanceDB数据库,并运行脚本创建MenuMaster表并插入示例记录。appsettings。json文件,更改DefaultConnection连接字符串与您的SQL服务器连接。在Startup.cs文件中,添加我们在本文中讨论的所有代码。这是一个简单的演示应用程序,我们有固定的管理员和经理的角色,你也可以改变根据你的要求和CSS设计菜单和子菜单移动兼容性不好,您可以添加您自己的引导程序设计来实现你的菜单风格。希望你们都喜欢这篇文章,很快我们将看到另一篇文章中有更多的活生生的例子。 历史 ASPNETCORERoleManagement - 2018-04-03 本文转载于:http://www.diyabc.com/frontweb/news19730.html

ASP。使用依赖注入的asp.net Core 2.0用户角色库动态菜单管理的更多相关文章

  1. ASP&period;NET 依赖注入。

    ASP.NET 依赖注入. http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注 ...

  2. ASP &period;NET依赖注入理解

    ASP .NET依赖注入理解[转]:  https://www.cnblogs.com/wzk153/p/10892444.html

  3. Asp&period;NetCore依赖注入和管道方式的异常处理及日志记录

    前言     在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...

  4. C&num;反射与特性&lpar;六&rpar;:设计一个仿ASP&period;NETCore依赖注入Web

    目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...

  5. 几个步骤轻松搞定ASP&period;NET 依赖注入。

    http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注入的问题.但是每次新建一个依 ...

  6. VS2019 &period;Net Core 3&period;0 Web 项目启用动态编译

    VS2019 中 .Net Core 3.0 项目默认没有启用动态编译, 这导致按F5调试的时候,修改了 HTML 代码,在浏览器上刷新没有效果. 启用动态编译方法如下: 1. 安装 Microsof ...

  7. Asp&period;Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. 学习ASP&period;NET Core,你必须了解无处不在的&OpenCurlyDoubleQuote;依赖注入”

    ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middleware自身的实现,以及构建在这个管道的应用,都需要 ...

  9. ASP&period;NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

随机推荐

  1. SAP屠夫---折旧在13-16调整期间的烦恼&lpar;转&rpar;

    "应尽量避免在13-16期的折旧行为",在去年新准则ERP调整时就强调过,实际上, 有的企业并不使用13-16期间, 假设某家企业将折旧折在13期, 非常可惜的是,sap的折旧费用 ...

  2. VS2013配置WTL90&lowbar;4140&lowbar;Final

    网上关于WTL的文章,尤其是中文的文章不多,根据收集的资料整理出了VS2013安装WTL的方法. 1.下载.文件很小的,地址:http://sourceforge.net/projects/wtl/f ...

  3. C&num;读写Shapefile

    Shapefile文件是ArcGIS存储矢量要素的标准格式,要读写Shapefile最简单的方法当然是基于ArcObject(或者ArcEngine)开发,不过网上也有一些开源的解译Shapefile ...

  4. heartbeat&plus;DRBD 高可用 双机热备

    heartbeat+DRBD 高可用 双机热备 原创博文http://www.cnblogs.com/elvi/p/7658109.html ## heartbeat+DRBD 高可用 双机热备 # ...

  5. BZOJ 3551&colon; &lbrack;ONTAK2010&rsqb;Peaks加强版 &lbrack;Kruskal重构树 dfs序 主席树&rsqb;

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  6. QtCreator 调试源码

    [1]安装源码 声明:要想调试进入Qt源码,必须首先保证我们安装了Qt源码.下面说明安装Qt源码注意事项. 一般安装过程(默认不安装源码): 安装源码过程(需要自己设置,点击“全选”): 综上所述:Q ...

  7. linux install nodejs

    下载/安装python yum install -y bzip2* #nodejs 0.8.5需要,请安装python前,先安装此模块.   wget http://www.python.org/ft ...

  8. ELK学习笔记之ELK分析nginx日志

    0x00 配置FIlebeat搜集syslog #安装 rpm -ivh filebeat-6.2.3-x86_64.rpm mv /etc/filebeat/filebeat.yml /etc/fi ...

  9. &lbrack;转&rsqb; 用协议分析工具学习TCP&sol;IP

    一.前言 目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天.目前号称搞网的 ...

  10. 关于Java中常用加密&sol;解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...