当我们默认新建一个ASP.NET MVC项目的时候,使用的身份认证系统是ASP.NET Identity.
但是这里的Identity使用的主键为String类型的GUID.当然这是大多数系统首先类型.
但是因为历史原因,而我们公司所有项目主键都是用的Int类型(这里不讨论int和GUID的优劣)
所以默认的String类型GUID就不能满足我们的需求,所以进行一些扩展,让其支持Int类型。
下图为默认使用String做主键的ASP.NET MVC

ApplicationUser继承自IdentityUser,而IdentityUser继承/实现
IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
这样就使得主键为string类型了,其中IentityUser,IdentityUserLogin,IdentityUserRole,IdentityUserClaim都是<string>
所以生成默认的数据库里的表结构成了下图这样,主键都为nvarchar

接下来,扩展为Int主键首先增加如下几个类

public class ApplicationUserLogin : IdentityUserLogin<int> { }
public class ApplicationUserCliam : IdentityUserClaim<int> { }
public class ApplicationUserRole : IdentityUserRole<int> { }
public class ApplicationRole : IdentityRole<int, ApplicationUserRole>, IRole<int> {
public string Description { get; set; }
public ApplicationRole() { }
public ApplicationRole(string name)
: this()
{
this.Name = name;
}
public ApplicationRole(string name, string description)
: this(name)
{
this.Description = description;
}
}

ApplicationUserLogin  继承自IdentityUserLogin<int>
ApplicationUserCliam  继承自IdentityUserClaim<int>
ApplicationUserRole   继承自IdentityUserRole<int>
ApplicationRole       继承自IdentityRole<int, ApplicationUserRole>, IRole<int>
在Role里还增加了一个属性Deacription(默认实体里只有Id,Name)
做了这步后。其实在Code first中,我们就已经把实体的结构主键修改为int型了,
只要用这个对应实体Update到数据库中的话。主键会修改成int
然后我们还要对应ASP.NET MVC的一些改造才可以适应现有的模板
然后我们将ApplicationUser修改

public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// 请注意,authenticationType 必须与 CookieAuthenticationOptions.AuthenticationType 中定义的相应项匹配
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// 在此处添加自定义用户声明
return userIdentity;
}
}

修改为:

public class ApplicationUser
: IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserCliam>, IUser<int>
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
// 请注意,authenticationType 必须与 CookieAuthenticationOptions.AuthenticationType 中定义的相应项匹配
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// 在此处添加自定义用户声明
return userIdentity;
}
}

接下来我们要修改数据库上下文ApplicationDbContext

修改为

public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationUserRole, int,
ApplicationUserLogin, ApplicationUserRole, ApplicationUserCliam>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}

然后在增加如下两个类

public class ApplicationUserStore
: UserStore<ApplicationUser, ApplicationRole, int,
ApplicationUserLogin, ApplicationUserRole, ApplicationUserCliam>,
IUserStore<ApplicationUser, int>,
IDisposable
{
public ApplicationUserStore(DbContext context)
: base(context)
{ }
public ApplicationUserStore()
: this(new IdentityDbContext())
{
base.DisposeContext = true;
}
}
public class ApplicationRoleStore
: RoleStore<ApplicationRole, int, ApplicationUserRole>,
IQueryableRoleStore<ApplicationRole, int>,
IRoleStore<ApplicationRole>,
IDisposable
{
public ApplicationRoleStore()
: base(new IdentityDbContext())
{
base.DisposeContext = true;
}
    </span><span style="color: #0000ff">public</span><span style="color: #000000"> ApplicationRoleStore(DbContext context)
: </span><span style="color: #0000ff">base</span><span style="color: #000000">(context)
{
}
}</span></pre></div>

上面的几处代码全修改在IdentityModels.cs文件中

然后修改App_Start\IdentityConfig.cs
在类ApplicationUserManager和ApplicationSignInManager中
把里面所有继承自<ApplicationRole>泛型的地址全部都修改为<ApplicationRole,int>
public class ApplicationUserManager : UserManager<ApplicationUser,int>
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
manager.UserValidator = new UserValidator<ApplicationUser, int>(manager)
manager.RegisterTwoFactorProvider("电话代码", new PhoneNumberTokenProvider<ApplicationUser,int>
manager.RegisterTwoFactorProvider("电子邮件代码", new EmailTokenProvider<ApplicationUser,int>
public class ApplicationSignInManager : SignInManager<ApplicationUser, int>

在App_Start\Startup.Auth.cs
把配置登陆Cookie的代码修改为

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// 当用户登录时使应用程序可以验证安全戳。
// 这是一项安全功能,当你更改密码或者向帐户添加外部登录名时,将使用此功能。
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (claim) => int.Parse(claim.GetUserId()))
//regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});

到此,所有的扩展都已经修改完成,接下来就只要修改相关的View和Controller
在AccountController和ManageController中,
主要是把用到User.Identity.GetUserId()的地方修改为User.Identity.GetUserId<int>();
这样使得拿到的主键由string变成了int

接下来运行程序包管理控制台,生成数据库脚本并执行到数据库

PM> Enable-Migrations
正在检查上下文的目标是否为现有数据库...
已为项目 IntegerDemo 启用 Code First 迁移。
PM> Add-Migration FirstInit
正在为迁移“FirstInit”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。在下一次搭建迁移基架时,将使用此快照计算对模型的更改。如果对要包含在此迁移中的模型进行其他更改,则您可通过再次运行“Add-Migration FirstInit”重新搭建基架。
PM> Update-Database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
正在应用显式迁移: [201506240620390_FirstInit]。
正在应用显式迁移: 201506240620390_FirstInit。
正在运行 Seed 方法。

再看我们的数据库,已经把主键全都变成了int

相关文档资料
http://www.asp.net/identity
http://typecastexception.com/post/2014/07/13/ASPNET-Identity-20-Extending-Identity-Models-and-Using-Integer-Keys-Instead-of-Strings.aspx
转载请标明出处:http://giantliu.com

扩展ASP.NET Identity使用Int做主键的更多相关文章

  1. 使用Guid做主键和int做主键性能比较

    使用Guid做主键和int做主键性能比较 在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法 说明道理.碰巧今天在数据库的优化过程中 ...

  2. mysql5.5 uuid做主键与int做主键的性能实测

    数据库:mysql5.5 表类型:InnoDB 数据量:100W条 第一种情况: 主键采用uuid 32位. 运行查询语句1:SELECT COUNT(id) FROM test_varchar; 运 ...

  3. int 和guid做主键的时候性能的区别

    1.在经常需要做数据迁移的系统中,建议用Guid.并且在相应的外键字段,也就是用来做连接查询的字段添加非聚集索引,对于改善性能有极大的好处.where条件的字段也可以适当添加非聚集索引. 2.在使用G ...

  4. 从Membership 到 .NET4.5 之 ASP.NET Identity

    我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...

  5. [转]Membership 到 .NET4.5 之 ASP.NET Identity

    本文转自:http://www.cnblogs.com/jesse2013/p/membership-part3.html 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然 ...

  6. 【ASP.NET Identity系列教程(三)】Identity高级技术

    注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

  7. (转)从Membership 到 .NET4.5 之 ASP.NET Identity

    引入 - 用户信息是如何存在数据库中的 我们前两篇都只讲到了怎么用Membership注册,登录等,但是我们漏掉了一个很重要并且是基本上每个用Membership的人都想问的,我的用户信息怎么保存?我 ...

  8. ASP.NET Identity 三(转载)

    转载来源:http://www.cnblogs.com/r01cn/p/5194257.html 注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软 ...

  9. ASP.NET Identity系列教程-4【Identity高级技术】

    https://www.cnblogs.com/r01cn/p/5194257.html 15 ASP.NET Identity高级技术 In this chapter, I finish my de ...

随机推荐

  1. C#获取H5页面上传图片代码

    基于上一篇的H5压缩上传图片,由于图片是以二进制字符流blob的形式传过来的,所以应该想将其转成bytes类型再进行转换 public void ProcessRequest(HttpContext ...

  2. Install Google Chrome on Fedora 28/27, CentOS/RHEL 7.5 (在 fedora 28 等 上 安装 chrome)

    今天在使用 fedora 安装 chrome 的时候遇到了问题,今天进行将安装过程进行记录下来.需要安装第三方软件仓库. 我们需要进行安装 fedora-workstation-repositorie ...

  3. input输入的数据只允许整数和浮点型数据

    //第一步:引入jquery //第二步:input输入框绑定该函数 例如:<input type="text" name="price" onInput ...

  4. 50个常用sql语句 网上流行的学生选课表的例子

    50个常用sql语句 建表: --学生表tblStudent(编号StuId.姓名StuName.年龄StuAge.性别StuSex) --课程表tblCourse(课程编号CourseId.课程名称 ...

  5. 常见的web攻击方式

    跨站脚本攻击(XSS) 概述 跨站脚本攻击(XSS,Cross-site scripting),指攻击者在网页中嵌入恶意脚本程序,是最常见和基本的攻击WEB网站的方法.攻击者在网页上发布包含攻击性代码 ...

  6. 阿里八八β阶段Scrum(1/5)

    今日进度 叶文滔: 修改了α阶段遗留的部分界面BUG,比如状态栏白底等 张岳: 修复用户模块信息修改返回失败的BUG 林炜鸿: 重构了添加事件的代码,增加可修改的特性 黄梅玲: 绘制了新的日程显示格界 ...

  7. RBAC权限管理系统数据模型

    懒得多写了,懂的看建表脚本就懂了... -- ---------------------------- -- Table structure for ucb_user -- ------------- ...

  8. node及socket.io实现简易websocket双向通信

    技术栈: vue2.0 + node + websocket( socket.io ) 1. 安装依赖 初始化vue项目后输入下方指令安装依赖包 // 推荐cnpm安装 npm i vue-socke ...

  9. ansible-task模块写法归类

    转载: https://blog.csdn.net/pushiqiang/article/details/78249665

  10. ansible-role写法

    一.role目录的创建: cd /etc/ansible/ mkdir -pv roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers, ...