ASP.NET MVC5+MySql使用ASP.NET 身份验证
2016-10-07 09:19
661 查看
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版。
在下一上窗口中,选择“MVC”,取消“Host in the cloud”,身份验证选“个人用户帐户”,点“确定”。
这意味着不必另利安装EntityFramework等程序包。
或PM> install-package mysql.data.entity。
<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、密码、数据库名等字段要根据实际情况更改,本例中数据库名即为前述所建的数据库的名称。
PM> enable-migrations
正在检查上下文的目标是否为现有数据库...
已为项目 WebApplication19 启用 Code First 迁移。
这时,可在解决方案资源管理器中看到生成了Migrations文件夹,并在此文件夹内生成了一个Configuration.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;
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将出错。
迁移,我们需要创建一个自定义的数据库初始化器,
给项目增加一个名为 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为先前建立的数据库的名称。
修改 IdentityModel.cs
文件代码,在 ApplicationDbContext()方法中增加如下语句:
Database.SetInitializer(new MySqlInitializer());
应用创建新的角色。
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 =
"SkdN)_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;
using Microsoft.AspNet.Identity.EntityFramework;
using XpSite.Models //XpSite为项目名称。
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 "";
}
这样就可以将用户的角色传到页面了。如果一个用户有多角色,则角色字符串为多个角色名的组合,且中间以“_”分隔。
public ActionResult Index() {
ViewBag.Role = CurrentRole();
return View();
}
身份验证实现用户和角色功能
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 =
"SkdN)_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运行项目,可进行用户注册、登录等操作,在数据库中自动生成相关表。相关文章推荐
- ASP.NET MVC5+MySql使用ASP.NET 身份验证实现用户和角色功能 1 概述 目标:使用MySql数据库,建立一个使用ASP.NET 身份验证的应用,并实现角色功能,身份
- 我要学ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
- ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
- 光脚丫学ASP.NET MVC(0004):在ASP.NET MVC中使用Forms身份验证
- ASP.NET MVC使用Oauth2.0实现身份验证
- ASP.NET MVC使用Oauth2.0实现身份验证
- [小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证
- 我要学ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
- asp.net中使用基于角色的身份Forms验证 (3)
- 在asp.net使用web.config身份验证
- asp.net中使用窗体身份验证
- 使用ASP.Net Forms模式实现WebService身份验证
- 使用ASP.Net Forms模式实现WebService身份验证
- 使用ASP.Net Forms模式实现WebService身份验证 (转)
- asp.net中使用窗体身份验证
- asp.net中使用基于角色的身份Forms验证 (2)
- [导入]如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证