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

ASP.NET MVC5+MySql使用ASP.NET 身份验证实现用户和角色功能

 

 

1    概述

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

材料:Visual Studio 2015 MySql 5.6.33Connector/Net 6.9.9MySQL 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”安装,安装完成后会在解决方案资源管理器中的引用项下自动生成EntityFrameworkEntityFramework.SqlServerMySql.DataMySql.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运行项目,可进行用户注册、登录等操作,在数据库中自动生成相关表。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值