65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.54/5 (10投票s)

2018 年 3 月 17 日

CPOL

8分钟阅读

viewsIcon

35585

downloadIcon

878

在本文中,我们将详细介绍如何在 MVC 应用程序中使用 ASP.NET Core Identity 创建用户角色,并根据用户角色显示菜单。

引言

在本文中,我们将详细介绍如何在 MVC 应用程序中使用 ASP.NET Core Identity 创建用户角色,并根据用户角色显示菜单。

在这里,我们将看到如何

  • 创建默认管理员用户
  • 创建默认管理员角色
  • 将未经身份验证的用户重定向到登录页面
  • 仅为授权的管理员用户显示管理员页面菜单

ASP.NET Identity 允许我们在系统中添加登录功能。在本演示中,我们将使用 SQL Server 来存储用户详细信息和配置文件数据。我们将使用 ASP.NET Identity 进行新用户注册、登录以及维护用户配置文件数据。说到登录,重要的一点是已登录用户是否已进行身份验证以及是否有权查看页面。

身份验证和授权

身份验证

检查有效用户。问题是如何检查用户是否有效。当用户第一次访问网站时,他/她将为该网站注册。他们的所有信息,如用户名、密码、电子邮件等都将存储在网站数据库中。当用户输入其用户 ID 和密码时,将与数据库中的信息进行比较。如果用户输入的用户名和密码与数据库中的相同,那么他/她就是有效用户,并将被重定向到网站的主页。如果用户输入的用户名或密码与数据库不匹配,那么登录页面将显示一条消息,例如“请输入有效的用户名或密码”。检查用户是否有效以及是否有权访问网站的整个过程称为身份验证。 

Authorization

一旦用户经过身份验证,他们就需要根据其角色被重定向到相应的页面。例如,当管理员登录时,需要将他们重定向到管理员页面。如果会计登录,则需要将他/她重定向到其帐户页面。

背景

必备组件

请确保您的计算机上已安装所有先决条件。如果没有,请一个接一个地下载并安装它们。

  1. 首先,从此链接下载并安装 Visual Studio 2017
  2. SQL Server 2014 或更高版本

Using the Code

步骤 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 

运行 DB 脚本后,我们可以看到数据库已创建,但表尚未创建。

步骤 2:创建您的 ASP.NET Core

安装 Visual Studio 2017 后,单击“开始”,然后单击“程序”,选择“Visual Studio 2017” - 单击“Visual Studio 2017”。单击“新建”,然后单击“项目”,选择“Web”,然后选择“ASP.NET Core Web Application”。输入您的项目名称,然后单击“创建”。

选择 Web 应用程序(模型-视图-控制器),然后单击“更改身份验证”。

选择“单独的用户帐户”,然后单击“确定”来创建您的项目。

更新 appsettings.json

appsettings.json 文件中,我们可以找到 DefaultConnection 连接字符串。在此连接字符串中,更改您的 SQL Server 名称、UID 和 PWD,以便在一个数据库中创建和存储所有用户详细信息。

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

步骤 3:在 Startup.cs 文件中添加 Identity 服务

默认情况下,在您的 ASP.NET Core 应用程序中,Identity 服务将添加到 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 Identity 服务的方式如下:

步骤 4:注册并创建您的第一个用户

现在,我们的 ASP.NET Core Web 应用程序已准备好供用户在我们的网站上注册,用户也可以在注册后登录我们的系统。我们将在接下来的步骤中通过向用户添加角色来实现授权。构建并运行您的应用程序,以注册您的第一个默认管理员用户。

单击“注册”链接以注册我们的第一个用户。

Migration

当我们单击“注册”按钮时,我们可以看到下面的页面。不要担心这个页面,因为第一次运行时需要进行迁移,只需单击“应用迁移”按钮。

我们可以看到迁移已成功应用,并单击“尝试刷新页面”消息。

刷新页面,我们可以看到新注册的用户已登录到我们的网站。

刷新数据库

当我们刷新数据库时,我们可以看到所有 Identity 表都已创建。

我们可以检查 aspNetUsers 表来查找新创建的用户详细信息。我们还可以看到 ASPNetRolesAspNetUserRoles 中没有记录,因为我们还没有创建任何角色或为角色添加用户。在下一步中,我们将创建一个名为“Admin”的新角色,并将新注册的用户添加为 Admin

步骤 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("syedshanumcain@gmail.com");
            var User = new ApplicationUser(); 
            await UserManager.AddToRoleAsync(user, "Admin");
        }

Startup.cs 文件中,我们可以找到 Configure 方法。在 Configure 方法中调用我们的 CreateUserRoles 方法。当我们构建并运行我们的应用程序时,我们可以在 ASPNetRole 表中看到新创建的“Admin”角色。

当我们构建并运行应用程序时,我们可以看到新角色已添加到 ASPNetRoles 表中,同时,我们还可以看到我们的默认用户已被分配了管理员角色。

步骤 6:创建管理员页面并设置授权

现在我们的 ASP.NET Core Web 应用程序有一个管理员用户。下一步,让我们创建一个新页面,并为该页面设置授权,使其只能由已登录的管理员用户查看。为此,我们创建一个名为 Admin 的新 Controller

创建管理员控制器

右键单击“Controller”文件夹,然后单击“添加新控制器”,选择“MVC 控制器 - 空”,然后单击“添加”。

将控制器名称输入为 Admin,然后单击“添加”。

在控制器中,右键单击“Index”,然后单击“添加视图”。单击“添加”按钮来创建我们的视图页面。

我们可以看到已创建 Admin Controller 和 Admin View。

打开 Admin/Index.cshtml 页面,根据您的需要进行设计。我在这里添加了一些简单的文本,如下所示:

接下来,我们创建一个新菜单来显示管理员页面。为了创建新菜单,请打开 Views/Shared 文件夹中的 _Layout.cshtml。像下图一样添加菜单

现在我们已经创建了管理员页面,也为我们的管理员添加了菜单。我们只为管理员用户创建了这个页面,其他用户或未登录用户不应看到此页面。如果我们运行应用程序会发生什么?

我们可以看到新的菜单“Admin Page”已被创建,并且现在所有人都可以访问。这意味着任何人都可以单击链接并查看该页面的内容。

在这里,我们可以看到,使用我们的登录信息,我们可以查看管理员页面。

设置授权

为避免这种情况,我们在管理员页面的控制器中使用授权。打开我们的 Admin Controller 并添加以下代码行:

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

如果我们运行应用程序并单击管理员页面,它将自动重定向到登录页面。

请注意,只有管理员角色的成员才能查看管理员页面,因为我们只为管理员角色设置了授权。如果要添加更多角色,可以使用逗号,如下面的代码所示:

[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>

我们的代码看起来是这样的:

运行应用程序,我们可以看到默认情况下,“Admin Page”不会显示在我们的顶部菜单中。只有已登录的管理员角色的用户才能查看菜单。

让我们尝试使用我们最初创建的管理员用户登录。

登录后,我们可以看到管理员用户现在可以查看管理员页面菜单。

让我们尝试创建一个普通用户,就像我们现在注册新用户一样。

注册后,我们可以看到,对于此用户,我们没有添加“Admin”角色,他/她也无权查看管理员页面。

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

关注点

首先,在您的 SQL Server 中创建一个名为 InventoryDB 的示例数据库。在 appsettings.json 文件中,将 DefaultConnection 连接字符串更改为您的 SQL Server 连接。在 Startup.cs 文件中,添加本文中讨论的所有代码。在下一篇文章中,我们将详细介绍如何在 ASP.NET Core 2.0 中执行用户角色管理以及自定义用户注册/登录页面。

历史

  • 2018/03/17:ASPNETCoreUserIdentity.zip
© . All rights reserved.