目录
介绍
身份验证和授权
身份验证
授权
背景
先决条件
使用代码
第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或密码与数据库不匹配,则登录页面将显示一条消息,例如“请输入有效的用户名或密码”。检查用户是否有效访问网站的整个过程称为身份验证。
授权用户通过身份验证后,需要通过他/她的角色将其重定向到相应的页面。例如,当管理员登录时,则需要重定向到管理页面。如果会计师已登录,则需要将他/她重定向到其“帐目”页面。
背景 先决条件确保已安装计算机中的所有先决条件。如果没有,那么一个接一个地下载并安装它们。
- 首先,从此链接下载并安装Visual Studio 2017
- SQL Server 2014或更高版本
首先,我们将创建一个数据库,并使用我们的新数据库连接在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
运行数据库脚本后,我们可以看到已创建数据库并且尚未创建表。
安装Visual Studio 2017后,单击“开始”,然后单击“程序”,选择“ Visual Studio 2017”——单击“ Visual Studio 2017”。单击New,然后单击Project,选择Web,然后选择 ASP.NET Core Web Application。输入您的项目名称并单击。
选择Web应用程序(模型-视图-控制器),然后单击“更改身份验证”。
选择个人用户帐户,然后单击确定以创建项目。
在appsettings.json文件中,我们可以找到 DefaultConnection 连接字符串。在连接字符串中,更改你的SQL Server名称,UID和PWD以在一个数据库中创建和存储所有用户详细信息。
"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()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
//Password Strength Setting
services.Configure(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身份服务如下:
现在,我们的ASP.NET Core Web应用程序已准备好供用户在我们的网站上注册,且用户也可以在注册后登录我们的系统。我们将通过在后续步骤中向用户添加角色来执行授权。构建并运行应用程序以注册您的第一个默认管理员用户。
单击注册链接注册我们的第一个用户。(PS:建议注册用户和下图一样,否则下面创建Admin角色时,其方法中的对应用户名改为您自行注册的也可。另一个问题,把Configure方法中最后一句注释掉,创建角色在下面的步骤中会介绍,但是在创建数据库表之前不需要——如果您用的此文提供的案例,否则不需要考虑。)
当我们点击“注册”按钮时,我们可以看到下面的页面。不要对这个页面感到恐慌,因为第一次运行我们需要进行迁移,只需单击Apply Migrations按钮。
我们可以看到确认为“已应用迁移”,然后单击“尝试刷新页面消息”。
刷新页面,我们可以看到新注册的用户已登录我们的网站。
刷新数据库时,我们可以看到所有的Identity表都已创建。
我们可以检查aspNetUsers表以查找新创建的用户详细信息。我们还可以看到ASPNetRoles并且ASPNetUserRoles没有记录,因为我们尚未为角色创建任何角色或添加用户。在下一步中,我们将添加一个新角色为“ Admin”,我们将新注册用户添加为Admin。
我们使用以下方法创建一个新角色为“ Admin”,我们将最近注册的“ Admin” 分配给我们的网站。打开Startup.cs文件,并在你的Startup.cs文件中添加以下方法。
private async Task CreateUserRoles(IServiceProvider serviceProvider)
{
var RoleManager = serviceProvider.GetRequiredService();
var UserManager = serviceProvider.GetRequiredService();
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("syedshanumcain@gmail.com");
var User = new ApplicationUser();
await UserManager.AddToRoleAsync(user, "Admin");
}
从Startup.cs文件中,我们可以找到该Configure方法。从这个Configure方法调用我们的CreateUserRoles方法。当我们构建和运行应用程序时,我们可以看到在ASPNetRole表中将创建“Admin”的新角色 。
当我们构建并运行应用程序时,我们可以看到ASPNetRoles表中添加了新角色,并且我们可以看到我们的默认用户已被分配了 Admin角色。
现在我们有一个用于ASP.NET Core Web应用程序的Admin用户。下一步,让我们创建一个新页面并将此页面的授权设置为仅登录,仅管理员用户可以查看此页面。为此,我们创建了一个新命命名为Admin的Controller。
创建Admin控制器右键单击Controller文件夹并单击Add New Controller,选择MVC Controller - Empty,然后单击Add。
输入您的Controller名称为Admin,然后单击Add。
在控制器中,右键单击Index,然后单击添加视图。单击“添加”按钮以创建视图页面。
我们可以看到我们的管理控制器和管理视图已创建。
打开Admin / Index.cshtml页面以根据需要进行设计。在这里,我添加了如下的简单文字:
接下来,我们创建一个新菜单以显示Admin Page。要创建新菜单,请从Views / Shared文件夹中打开_Layout.cshtml。添加如下图所示的菜单:
现在我们已经创建了管理页面,并为管理员添加了菜单。我们仅为Admin用户创建了此页面,其他用户或未登录的用户不应该看到此页面。如果我们运行我们的应用程序会发生什么。
我们可以看到新的菜单“Admin Page”已经创建,现在对所有人开放。这意味着任何人都可以单击该链接并查看该页面的内容。
在这里,我们可以看到,我们可以通过登录查看管理页面。
为避免这种情况,我们在管理页面控制器中使用授权。打开我们的 Admin控制器并添加以下代码行:
[Authorize(Roles = "Admin")]
public IActionResult Index()
{
return View();
}
如果我们运行我们的应用程序并单击Admin Page,它将自动重定向到Log in页面。
请注意,只有管理员角色成员才能查看管理页面,因为我们仅为管理员角色设置了授权。如果您想添加更多角色,我们可以使用逗号,如下面的代码:
[Authorize(Roles = "Admin,SuperAdmin,Manager")]
第7步:按用户角色显示隐藏菜单
现在让我们更进一步的只显示登录管理员用户的管理员菜单。为此,我们从Views / Shared文件夹下打开Layout.cshtml并编辑新添加的菜单,如下面的代码。在这个代码中,首先我们检查用户是否已经过身份验证,意味着登录,然后我们检查用户是否具有查看菜单的授权。
@if (User.Identity.IsAuthenticated)
{
@if (User.IsInRole("Admin"))
{
Admin Page
}
}
以下是我们的代码:
运行应用程序,默认情况下我们可以看到“Admin Page”不会显示在我们的顶层菜单中。仅登录管理员角色用户可以查看菜单。
让我们通过我们最初创建的管理员用户登录来试试这个。
登录后,我们可以看到管理员用户现在可以查看Admin Page菜单。
让我们尝试创建普通用户,因为我们现在在注册新用户。
注册后,我们可以看到,对于这个用户,我们没有添加“Admin&rdquorole”,他无权查看Admin Page。
参考链接: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