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

981 篇文章 45 订阅
60 篇文章 3 订阅

目录

介绍

身份验证和授权

身份验证

授权

背景

先决条件

使用代码

第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或密码与数据库不匹配,则登录页面将显示一条消息,例如请输入有效的用户名或密码。检查用户是否有效访问网站的整个过程称为身份验证 

授权

用户通过身份验证后,需要通过他/她的角色将其重定向到相应的页面。例如,当管理员登录时,则需要重定向到管理页面。如果会计师已登录,则需要将他/她重定向到其帐目页面。

背景

先决条件

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

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

使用代码

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

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

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

2步:创建ASP.NET Core 

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

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

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

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

选择个人用户帐户,然后单击确定以创建项目。

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

更新appsettings.json

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

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

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

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

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

https://www.codeproject.com/KB/aspnet/1235077/5_1.PNG

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

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

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

单击注册链接注册我们的第一个用户。(PS:建议注册用户和下图一样,否则下面创建Admin角色时,其方法中的对应用户名改为您自行注册的也可。另一个问题,把Configure方法中最后一句注释掉,创建角色在下面的步骤中会介绍,但是在创建数据库表之前不需要——如果您用的此文提供的案例,否则不需要考虑。)

https://www.codeproject.com/KB/aspnet/1235077/7.PNG

迁移

当我们点击注册按钮时,我们可以看到下面的页面。不要对这个页面感到恐慌,因为第一次运行我们需要进行迁移,只需单击Apply Migrations按钮。

https://www.codeproject.com/KB/aspnet/1235077/8.PNG

我们可以看到确认为已应用迁移,然后单击尝试刷新页面消息

https://www.codeproject.com/KB/aspnet/1235077/9.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/12.PNG

刷新数据库

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

https://www.codeproject.com/KB/aspnet/1235077/10.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/11.PNG

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”的新角色 

https://www.codeproject.com/KB/aspnet/1235077/13.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/14.PNG

6步:创建管理页面和设置授权

现在我们有一个用于ASP.NET Core Web应用程序的Admin用户。下一步,让我们创建一个新页面并将此页面的授权设置为仅登录,仅管理员用户可以查看此页面。为此,我们创建了一个新命命名为AdminController

创建Admin控制器

右键单击Controller文件夹并单击Add New Controller,选择MVC Controller - Empty,然后单击Add

https://www.codeproject.com/KB/aspnet/1235077/16.PNG

输入您的Controller名称为Admin,然后单击Add

https://www.codeproject.com/KB/aspnet/1235077/17.PNG

在控制器中,右键单击Index,然后单击添加视图。单击添加按钮以创建视图页面。

https://www.codeproject.com/KB/aspnet/1235077/18.PNG

我们可以看到我们的管理控制器和管理视图已创建。

https://www.codeproject.com/KB/aspnet/1235077/19.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/18.PNG

接下来,我们创建一个新菜单以显示Admin Page。要创建新菜单,Views / Shared文件夹中打开_Layout.cshtml。添加如下图所示的菜单:

https://www.codeproject.com/KB/aspnet/1235077/20.PNG

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

我们可以看到新的菜单Admin Page已经创建,现在对所有人开放。这意味着任何人都可以单击该链接并查看该页面的内容。

https://www.codeproject.com/KB/aspnet/1235077/21.PNG

在这里,我们可以看到,我们可以通过登录查看管理页面。

https://www.codeproject.com/KB/aspnet/1235077/22.PNG

设置授权

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

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

https://www.codeproject.com/KB/aspnet/1235077/23.PNG

如果我们运行我们的应用程序并单击Admin Page,它将自动重定向到Log in页面。

https://www.codeproject.com/KB/aspnet/1235077/24.PNG

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

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

以下是我们的代码:

https://www.codeproject.com/KB/aspnet/1235077/25_0.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/25.PNG

让我们通过我们最初创建的管理员用户登录来试试这个。

https://www.codeproject.com/KB/aspnet/1235077/26.PNG

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

https://www.codeproject.com/KB/aspnet/1235077/27.PNG

让我们尝试创建普通用户,因为我们现在在注册新用户。

https://www.codeproject.com/KB/aspnet/1235077/28.PNG

注册后,我们可以看到,对于这个用户,我们没有添加“Adminrdquorole,他无权查看Admin Page

https://www.codeproject.com/KB/aspnet/1235077/29.PNG

参考链接: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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值