您的位置:首页 > 编程语言 > ASP

ASP.NET MVC5+MySql使用ASP.NET 身份验证实现用户和角色功能 1 概述 目标:使用MySql数据库,建立一个使用ASP.NET 身份验证的应用,并实现角色功能,身份

2018-01-25 15:24 1301 查看
ASP.NET MVC5+MySql使用ASP.NET 身份验证实现用户和角色功能

 

 


1    概述

目标:使用MySql数据库,建立一个使用ASP.NET 身份验证的应用,并实现角色功能,身份验证及角色的数据库为原有的MySql数据库,并用EF
Code First实现迁移。

材料:Visual Studio 2015 ,MySql 5.6.33,Connector/Net
6.9.9,MySQL for Visual Studio1.2.6 。

MySql 5.7不支持用“来自数据库的Code First”的方式新建ADO.NET实体数据模型,不能进入选择数据对象和设置的步骤,不能选择表,所以选择5.6版。

 

 


2    步骤


2.1  建立数据库

在MySql server中建立数据库mysitedb,采用utf8_general_ci字符集。


2.2      建立项目

在vs2015(中文版)中创建一个新的“ASP.NET Web应用程序”项目,选择framework4.5,为项目命名,点“下一步”。

在下一上窗口中,选择“MVC”,取消“Host
in the cloud”,身份验证选“个人用户帐户”,点“确定”。

 


2.3  安装MySql.Data.Entity

在项目中,通过“工具->NuGet包管理器->管理解决方案的NuGet程序包”启动“解决管理方案包”程序,在搜索区域输入“mysql.data.entity”,再单击“浏览”按钮,选择Mysql.Data.Entity”安装,安装完成后会在解决方案资源管理器中的引用项下自动生成EntityFramework、EntityFramework.SqlServer、MySql.Data、MySql.Data.Entity.EF6等四个引用,
这意味着不必另利安装EntityFramework等程序包。

或PM> install-package mysql.data.entity。


2.4  修改Web.config

修改web.config文件中的缺省连接字符串,如下:

<connectionStrings>

    <add name="DefaultConnection" connectionString="server=localhost;User
Id=root;password=password;Persist Security Info=True;database=mysitedb;charset=utf8"

        providerName="MySql.Data.MySqlClient" />

  </connectionStrings>

注意:其中服务器、用户Id、密码、数据库名等字段要根据实际情况更改,本例中数据库名即为前述所建的数据库的名称。

 


2.5  使迁移生效

在vs主菜单中依次选“工具”->“Nuget包管器”->“在程序包管理控制台”以打开在程序包管理控制台,并输入“Enable-Migrations”,使项目的迁移生效。如下:

 

PM> enable-migrations

正在检查上下文的目标是否为现有数据库...

已为项目 WebApplication19 启用 Code First 迁移。

 

这时,可在解决方案资源管理器中看到生成了Migrations文件夹,并在此文件夹内生成了一个Configuration.cs文件。


2.6  新增MySqlHistoryContext.cs

在上述migrations 文件夹下,新增名为MySqlHistoryContext.cs类文件, 并使其内容如下:

 

    public class MySqlHistoryContext : HistoryContext {

        public MySqlHistoryContext(DbConnection connection, string defaultSchema)
:base(connection, defaultSchema) { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();

            modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();

        }

    }

需要添加如下引用:

using System.Data.Common;

using System.Data.Entity;

using System.Data.Entity.Migrations.History;

 


2.7  修改configuration.cs

在migration 文件夹下,打开configuration.cs文件,修改构造函数如下:

 public Configuration()

        {

            AutomaticMigrationsEnabled = false;

 

            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());

 

            SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));

        }

 

SetSqlGenerator方法将生成MySql命令,而非SqlServer命令。若不如此修改,则后续的update-database将出错。

 


2.8  创建自定义的数据库初始化器

由于MySql Provider不支持Entity Framework 迁移,我们需要创建一个自定义的数据库初始化器,

给项目增加一个名为 MySqlInitializer.cs 的新类文件,并使其内容如下:

 

using WebApplication19.Models;

using System.Data.Entity;

using System.Data.Entity.Infrastructure;

using System.Linq;

 

namespace WebApplication19

{

 

    public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext>

    {

        public void InitializeDatabase(ApplicationDbContext context)

        {

            if (!context.Database.Exists())

            {

                // if database did not exist before - create it

                context.Database.Create();

            }

            else

            {

                // query to check if MigrationHistory table is present in the database

                var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(

                string.Format(

                  "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",

                  "mysitedb"));

 

                // if MigrationHistory table is not there (which is the case first time we run) - create it

                if (migrationHistoryTableExists.FirstOrDefault() == 0)

                {

                    context.Database.Delete();

                    context.Database.Create();

                }

            }

        }

    }

}

注意:其中WebApplication19为项目名称,mysitedb为先前建立的数据库的名称。


2.9  修改IdentityModel.cs文件

在项目的Models文件夹下, 修改 IdentityModel.cs 文件代码,在 ApplicationDbContext()方法中增加如下语句:

 Database.SetInitializer(new MySqlInitializer());


2.10  修改start.cs文件

在Startup.cs文件中,我们可以找到一个配置方法,通过这个方法,我们将调用CreateRolesandUsers()方法来创建缺省的用户角色和用户,我们将检查角色是否已创建,如果角色,如Admin,还没有创建,那么我们将创建一个新的“Admin”角色,再创建一个缺省用户并设置其角色为Admin。我们将使用该用户作为超级用户,该用户可通过MVC 应用创建新的角色。

       public void Configuration(IAppBuilder app)

        {

            ConfigureAuth(app);

            createRolesandUsers();

        } 

 

 

 private void createRolesandUsers()
{

            ApplicationDbContext context = new ApplicationDbContext();

 

            var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

            var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

 

 

            // In Startup iam creating first Admin Role and creating a default Admin User   

            if (!roleManager.RoleExists("Admin"))
{

 

                // first we create Admin rool  

                var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();

                role.Name = "Admin";

                roleManager.Create(role);

 

                //Here we create a Admin super user who will maintain the website                 

 

 

                var user = new ApplicationUser();

                user.UserName = "360932808@qq.com";//一定要与下同,否则无法登录。

                user.Email = "360932808@qq.com";

 

                string userPWD = "Skd&#N)_56";

 

                var chkUser = UserManager.Create(user, userPWD);

 

                //Add default User to Role Admin  

                if (chkUser.Succeeded) {

                    var result1 = UserManager.AddToRole(user.Id, "Admin");

 

                }

            }

 

            // creating Creating Manager role   

            if (!roleManager.RoleExists("Manager"))
{

                var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();

                role.Name = "Manager";

                roleManager.Create(role);

 

            }

 

            // creating Creating Employee role   

            if (!roleManager.RoleExists("Employee"))
{

                var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();

                role.Name = "Employee";

                roleManager.Create(role);

 

            }

        }

 

注:要引入“项目名.Models”空间,如:using WebApplication19.Models;还要引入如下空间:

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.EntityFramework;

 


2.11  修改HomeController.cs


2.11.1  增加命名空间

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.EntityFramework;

using XpSite.Models  //XpSite为项目名称。


2.11.2  增加以下方法:

 public string CurrentRole()
{

            if (User.Identity.IsAuthenticated) {

                var user = User.Identity;

                ApplicationDbContext context = new ApplicationDbContext();

                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

                var s = UserManager.GetRoles(user.GetUserId());

                string re = "";

                for (int i=0;i<s.Count;i++)
{

                    re += s[i].ToString()+"_";

                }

                return re;

            }

            return "";

        }

 


2.11.3  修改Index方法

如下,增加ViewBag.Role = CurrentRole();

这样就可以将用户的角色传到页面了。如果一个用户有多角色,则角色字符串为多个角色名的组合,且中间以“_”分隔。

  public ActionResult Index()
{

            ViewBag.Role = CurrentRole();

            return View();

        }

 


3    运行

Ctrl+F5运行项目,可进行用户注册、登录等操作,在数据库中自动生成相关表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐