Asp.Net MVC Identity 2.2.1 使用技巧(二)
之前我们看到了新生成的项目中跟identity有关的有四个文件,这些文件是基础功能,并未开启identity的全部功能。现在我们先启用角色功能。
1、在App_Start文件夹中的IdentityConfig.cs中添加角色控制器。
在namespace xxx内(即最后一个“}”前面)添加 角色控制类
代码如下:
//配置此应用程序中使用的应用程序角色管理器。RoleManager 在 ASP.NET Identity 中定义,并由此应用程序使用。
public class ApplicationRoleManager : RoleManager<IdentityRole>
{
public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
: base(roleStore)
{
} public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
}
}
2、修改startup文件,启用角色管理器(RoleManager)。
打开App_Start文件夹中的startup.auth.cs 在 public void ConfigureAuth(IAppBuilder app) 方法中(约为19行左右)加入 app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
修改完成后的代码如下:
// 配置数据库上下文、用户管理器和登录管理器,以便为每个请求使用单个实例
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); //添加的角色管理器
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
这里最基本的角色功能启用就完成了。
可选操作1:
这个可选操作用于在创建网站的时候,像网站数据库中添加一个管理用户。如果直接发布给别人用的话 还是挺不错的,自己用的话可以省略掉。
一、在identityconfig.cs可以配置添加一个用户(用户名为:“admin@123.com”,密码为“Admin@123456”)并把该用户添加到角色("Admin")中。
代码如下:
public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext context) {
InitializeIdentityForEF(context);
base.Seed(context);
} //创建用户名为admin@123.com,密码为“Admin@123456”并把该用户添加到角色组"Admin"中
public static void InitializeIdentityForEF(ApplicationDbContext db) {
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "admin@123.com";//用户名
const string password = "Admin@123456";//密码
const string roleName = "Admin";//用户要添加到的角色组 //如果没有Admin用户组则创建该组
var role = roleManager.FindByName(roleName);
if (role == null) {
role = new IdentityRole(roleName);
var roleresult = roleManager.Create(role);
}
//如果没有admin@123.com用户则创建该用户
var user = userManager.FindByName(name);
if (user == null) {
user = new ApplicationUser { UserName = name, Email = name };
var result = userManager.Create(user, password);
result = userManager.SetLockoutEnabled(user.Id, false);
} // 把用户admin@123.com添加到用户组Admin中
var rolesForUser = userManager.GetRoles(user.Id);
if (!rolesForUser.Contains(role.Name)) {
var result = userManager.AddToRole(user.Id, role.Name);
}
}
}
二、修改Models文件夹中IdentityModels.cs
在public class ApplicationDbContext : IdentityDbContext<ApplicationUser>类中添加初始化设置。
代码如下:
static ApplicationDbContext()
{
// 在第一次启动网站时初始化数据库添加管理员用户凭据和admin 角色到数据库
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
可选操作2:自定义用户名和密码验证规则
自定义用户名验证规则,例如QQ.com。
要完成这个功能我们可以添加自定义的用户验证策略,只要继承继承UserValidator<T> 然后 Override ValidateAsync 方法。
1、为了管理方便,先创建一个文件夹“zidingyi”,在文件夹中添加一个名称为“CustomUserValidator.cs”的类文件,写入代码如下:
//自定义用户名email只支持QQ.com域名 public class CustomUserValidator : UserValidator<ApplicationUser>
{ public CustomUserValidator(ApplicationUserManager mgr)
: base(mgr)
{
}
//重写ValidateAsync方法
public override async Task<IdentityResult> ValidateAsync(ApplicationUser user)
{
IdentityResult result = await base.ValidateAsync(user); if (!user.Email.ToLower().EndsWith("@QQ.com"))
{
var errors = result.Errors.ToList();
errors.Add("Email 地址只支持QQ.com域名");
result = new IdentityResult(errors);
}
return result;
}
}
2、将自定义的UserValidator 附加到User Manger 对象上,操作如下:
打开App_Start/Identityconfig.cs 找到public static ApplicationUserManager Create()方法,把manager.UserValidator = new UserValidator<ApplicationUser>(manager)中的UserValidator替换为manager.UserValidator = new zidingyi.CustomUserValidator(manager);
可选操作3:自定义密码验证规则
自定义密码验证规则,如禁止类似“12345”的密码。
同上,完成这个我们只要继承PasswordValidator 并且Override ValidateAsync方法即可。
1、在文件夹“zidingyi”,添加一个名称为“CustomPasswordValidator.cs”的类文件,写入代码如下:
//自定义用户密码禁止类似12345 记得添加对应的using
public class CustomPasswordValidator : PasswordValidator
{
//重写ValidateAsync方法
public override async Task<IdentityResult> ValidateAsync(string pass)
{
IdentityResult result = await base.ValidateAsync(pass);
if (pass.Contains(""))
{
var errors = result.Errors.ToList();
errors.Add("密码不能为连续的数字");
result = new IdentityResult(errors);
}
return result;
}
}
2、将自定义的PasswordValidator 附加到UserManger 对象上,操作如下:
打开App_Start/Identityconfig.cs 找到public static ApplicationUserManager Create()方法,把manager.PasswordValidator = new PasswordValidator(54行)中的PasswordValidator替换为manager.PasswordValidator = new zidingyi.CustomPasswordValidator;
Asp.Net MVC Identity 2.2.1 使用技巧(二)的更多相关文章
- Asp.Net MVC Identity 2.2.1 使用技巧(一)
开发环境:vs2015 UP3 or vs2017RC 项目环境:asp.net 4.6.1 identity版本为:asp.net identity 2.2.1 1.创建项目. 没什么好说 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(八)
一.添加管理链接 在View/Shared/_layout.cshtml,在页面导航上(28行)添加如下代码: @*通过身份验证并确认用户属于Admin角色显示管理菜单*@ @if (Request. ...
- Asp.Net MVC Identity 2.2.1 使用技巧(七)
创建角色管理相关视图 1.添加视图 打开RolesAdminController.cs 将鼠标移动到public ActionResult Index()上 右键>添加视图 系统会弹出 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(六)
使用用户管理器之角色管理 一.建立模型,这里我们其实在之前的技巧(五)已经建好了. 二.建立控制器RolesAdminController 1.在controllers文件夹上点右键>添加> ...
- Asp.Net MVC Identity 2.2.1 使用技巧(五)
创建用户管理相关视图 1.添加视图 打开UsersAdminController.cs 将鼠标移动到public ActionResult Index()上 右键>添加视图 系统会弹出 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(四)
使用用户管理器之用户管理 一.建立模型 1.在Models文件夹上点右键 >添加>类 类的名称自定,我用AdminViewModels命名的. 2.更改模板自建的AdminView ...
- Asp.Net MVC Identity 2.2.1 使用技巧(三)
使用用户管理器之用户注册 用户管理的基本功能模块中已经做好了,我们现在做一些调整. 1.修改用户名注册规则. 上一篇中可选操作已经详解了这里把基本的设置简介下. 打开App_Start/identit ...
- ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
按照ASP.NET MVC Identity建立了一個用戶權限管理模塊,由于還要加自己已有的數據庫,所以建立了一個實體模型,建立了之后,發現登錄不了: 一直顯示“Login in failed for ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
随机推荐
- Delphi下OpenGL2d绘图(04)-画四边形
一.前言 画四边形基本上与前几遍文字代码是相同.区别在于glBegin()的参数“GL_QUADS”.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 ...
- c#和java中封装字段的不同
c#: private String name; public String Name { get { return name; } set { name = value; } } .csharpco ...
- ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例
原文出自:https://blog.csdn.net/seesun2012 思路: 1.加载页面,加载Ext.TaskManager.start()方法: 2.执行定时器方法: 3.获取地址向后台发送 ...
- JavaScript es6 class类的理解。
本着互联网的分享精神,在本篇文章我将会把我对JavaScript es6 class类的理解分享给大家. JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖. 类语法 ...
- php 数组任意位置插入值
array_splice() $arr = array('A', 'B', 'C'); $arr2 = 'abc';$t = array_splice($arr, 1, 0, $arr2); prin ...
- C# 实现将listview中已经显示的数据导出到Access 数据库
private void button1_Click(object sender, EventArgs e) { OleDbConnection dbconn = new OleDbConnectio ...
- ayer.prompt 怎样让输入值为空也可以向下执行
http://fly.layui.com/jie/4227/ layer.prompt({title: '输入任何口令,并确认',formType: 1, //prompt风格,支持0-2value: ...
- 【9】log4net 实例
一.创建项目并添加nuget: Install-Package log4net 二.添加配置文件 <configuration> <configSections> < ...
- jvm 类文件结构学习
本文以代码示例来学习 java 类文件的结构,其中对类文件结构的学习均来自周志明先生所著的 <深入理解 Java 虚拟机>一书,在此表示诚挚的感谢. 代码如下: package com.r ...
- fzou 1759 Super A^B mod C
Problem 1759 Super A^B mod CAccept: 456 Submit: 1488Time Limit: 1000 mSec Memory Limit : 32768 ...