zoukankan      html  css  js  c++  java
  • 开始使用ASP。NET Core 2.0身份和角色管理

    介绍 在本文中,我们将详细了解如何使用ASP。NET Core Identity在MVC应用程序中用于创建用户角色和根据用户角色显示菜单。 下面,我们来看看如何: 创建默认管理用户创建默认管理角色将未经身份验证的用户重定向到仅供授权管理用户使用的登录页面显示管理页面菜单 ASP。NET Identity允许我们添加登录功能到我们的系统。在这个演示中,我们将使用SQL Server存储用户详细信息和配置文件数据。我们将使用ASP。NET标识用于新用户注册、登录和维护用户配置文件数据。如果我们讨论登录,重要的部分是登录的用户是否经过身份验证,以及是否被授权查看页面。 身份验证和授权 身份验证 检查有效的用户。这里的问题是如何检查用户是否有效。当用户第一次访问某个网站时,他/她会注册该网站。他们的所有信息,如用户名、密码、电子邮件等,都将存储在网站数据库中。当用户输入他/她的用户名和密码时,数据库会对信息进行检查。如果用户输入了与数据库中相同的用户id和密码,那么他或她就是一个有效用户,并将被重定向到网站的主页。如果用户输入的用户id或密码与数据库不匹配,那么登录页面将给出一条消息,类似于“输入有效的用户名或密码”。检查用户是否合法访问网站的整个过程叫做认证。 授权 用户通过身份验证后,需要根据其角色将其重定向到适当的页面。例如,当管理员登录时,需要重定向到Admin页面。如果一个会计登录,然后他/她需要被重定向到他的帐户页面。 背景 先决条件 确保已在计算机中安装了所有先决条件。如果没有,那么下载并安装它们,一个一个。 首先,下载并安装Visual Studio 2017从这个链接sql Server 2014或以上 使用的代码 步骤1:创建数据库 首先,我们将创建一个数据库,并在appsets .json 文件中为DefaultConnection设置连接字符串,并使用我们的新数据库连接。我们将使用这个数据库的ASP。NET Core标识表创建。 创建数据库:运行以下脚本创建数据库。 隐藏,复制Code

    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。净Core  安装Visual Studio 2017之后,单击“开始”,然后单击“程序”并选择Visual Studio 2017——单击Visual Studio 2017。单击新建,然后项目,选择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方法中。您还可以在用户注册时额外添加密码强度,还可以使用以下代码设置默认的登录页/注销页和AccessDenaiedPath。 隐藏,收缩,复制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;
                });

    下面是我们如何添加ASP的。NET Core身份识别服务在我们的ConfigureService方法中看起来像: 步骤4:注册并创建第一个用户 现在我们的ASP。NET Core web应用程序已经为用户在我们的网站注册做好了准备,用户注册后也可以登录到我们的系统。在接下来的步骤中,我们将通过将role添加到user来进行授权。构建并运行应用程序以注册第一个默认管理用户。 单击Register链接注册我们的第一个用户。 迁移 当我们点击注册按钮,我们可以看到下面的页面。不要对这个页面感到恐慌,因为第一次运行时我们需要进行迁移,只需单击Apply Migrations按钮。 我们可以看到应用迁移时的确认,并单击Try刷新页面消息。 刷新页面,我们可以看到新注册的用户已经登录到我们的web站点。 刷新数据库 当刷新数据库时,可以看到所有标识表都已创建。 我们可以检查aspNetUsers表来找到新创建的用户详细信息。我们还可以看到ASPNetRoles和ASPNetUserRoles没有记录,因为我们尚未为角色创建任何角色或添加用户。在下一步中,我们将添加一个新角色“Admin”,并将新注册的用户添加为Admin。 步骤5:创建角色并为角色分配用户 我们使用下面的方法来创建一个新的角色为“Admin”,我们将分配最近注册为“Admin”到我们的网站。打开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 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");
            }

    在start .cs文件中,我们可以找到Configure方法。从这个配置方法调用我们的CreateUserRoles方法。当我们构建和运行我们的应用程序时,我们可以看到新的角色“Admin”将在ASPNetRole表中创建。 当我们构建和运行应用程序时,我们可以看到新的角色已经添加到ASPNetRoles表中,而且,我们还可以看到默认用户已经被分配了Admin角色。 步骤6:创建Admin页面并设置授权 现在我们有了一个管理用户的ASP。NET Core web应用程序。下一步,我们将创建一个新页面,并为该页设置授权,因为只有登录和管理用户才能查看该页。为此,我们创建一个名为Admin的新控制器。 创建管理控制器 右键单击Controller文件夹并单击Add New Controller,选择MVC Controller - Empty并单击Add。 输入控制器名称为Admin并单击Add。 从控制器中,右键单击索引并单击Add View。单击Add按钮创建我们的视图页面。 我们可以看到管理控制器和管理视图已经创建。 打开管理/索引。cshtml页面,以设计您的需要。在这里,我添加了简单的文本如下: 接下来,我们创建一个新菜单来显示Admin页面。要创建我们的新菜单,请打开_Layout。视图/共享文件夹中的cshtml。添加菜单如下图所示: 现在我们已经创建了管理页面,还为我们的管理添加了菜单。我们仅为Admin用户创建了此页面,其他用户或未登录的用户不应该看到此页面。如果我们运行我们的应用程序会发生什么。 我们可以看到,作为新的菜单“管理页”已经创建,它是开放的所有现在。这意味着任何人都可以单击该链接并查看该页面的内容。 在这里,我们可以看到,我们可以查看管理页面与我们的登录。 设置授权 为了避免这种情况,我们在管理页面控制器中使用授权。打开我们的管理控制器,添加以下代码行: 隐藏,复制Code

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

    如果我们运行我们的应用程序并单击管理页,它将自动重定向到登录页。 注意,只有管理角色成员才能查看管理页面,因为我们仅为管理角色设置了授权。如果你想添加更多角色,我们可以像下面的代码一样使用逗号: 隐藏,复制Code

    [Authorize(Roles = "Admin,SuperAdmin,Manager")]

    第7步:根据用户角色显示隐藏菜单 现在让我们向前迈进一步,仅为登录的管理用户显示管理菜单。为此,我们打开布局。从视图/共享文件夹中的cshtml编辑新添加的菜单,如下面的代码所示。在这段代码中,我们首先检查用户是否经过身份验证(即登录),然后检查用户是否具有查看菜单的授权。 隐藏,复制Code

    <li>
                       @if (User.Identity.IsAuthenticated)
                       {
                        @if (User.IsInRole("Admin"))
                           {
                 <aasp-area=""asp-controller="Admin"asp-action="Index">Admin Page</a>
                           }
                        }
                   </li>
    

    下面是我们的代码的样子: 运行应用程序,我们可以看到,默认情况下,“管理页面”不会显示在我们的顶部菜单。已登录的管理员角色用户可以单独查看菜单。 让我们试着用我们最初创建的Admin用户登录。 登录后,我们可以看到管理用户现在可以查看管理页面菜单。 在注册新用户时,让我们尝试创建一个普通用户。 注册后,我们可以看到,对于这个用户,我们没有添加“Admin&rdquorole,他没有访问管理页面的权限。” 参考链接:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?tabs=visual-studio%2Caspnetcore2x 的兴趣点 首先,在SQL服务器中创建一个示例InventoryDB数据库。appsettings。json文件,更改DefaultConnection连接字符串与您的SQL服务器连接。在Startup.cs文件中,添加我们在本文中讨论的所有代码。在下一篇文章中,我们将详细了解如何在ASP中执行用户角色管理和自定义用户注册/登录页面。2.0网络核心。 历史 2018/03/17: ASPNETCoreUserIdentity.zip 本文转载于:http://www.diyabc.com/frontweb/news17329.html

  • 相关阅读:
    把枚举类型绑定到datasource
    关于linq使用建议
    VS2012恢复默认设置的2种方法
    Manifold learning-based methods for analyzing single-cell RNA-sequencing data
    Single cell RNA-seq denoising using a deep count autoencoder
    scImpute——An accurate and robust imputation method scImpute for single-cell RNA-seq data
    第三代测序popular workflow
    js作用域闭包
    select的option选项左右移动
    添加区域练级联动
  • 原文地址:https://www.cnblogs.com/Dincat/p/13494109.html
Copyright © 2011-2022 走看看