博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net 验证授权(一)Identity入门
阅读量:6610 次
发布时间:2019-06-24

本文共 3307 字,大约阅读时间需要 11 分钟。

ASP .NET Identity

ASP .NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证、授权等等机制。在ASP .NET Identity里除了提供最基础的:用户注册、密码重设、密码验证等等基础功能之外,也提供了进阶的:Cookie登入、Facebook登入、Google登入等等进阶功能

ASP .NET Identity具有以下优势:

  1. 自定义用户信息
  2. 可以轻松地整合到 ASP.NET 各种框架以及程序上
  3. owin集成,Authentication(验证)基于owin中间件,可以再任何owin宿主上执行,不依赖system.web
  4. 第三方账号接入
  5. Nuget
  6. 兼容多种数据库(默认是code first 访问sqlserver)
  7. 自定义角色

ASP .NET Identity主要包括核心功能模块、EntityFramework模块以及OWIN模块。具体如下

  1. Microsoft.AspNet.Identity.Core   核心库,包含Identity的主要功能。
  2. Microsoft.AspNet.Identity.EntityFramework  主要包括ASP .NET Identity 的EF 部分的实现。
  3. Microsoft.AspNet.Identity.OWIN  ASP .NET Identity对OWIN 的支持。

使用默认数据库的Identity(sqlserver)

  1. 新建一个MVC项目

    967962-20190129102943141-243311528.png

  2. 选择个人用户账户验证

    967962-20190129103057198-1188242362.png

  3. 修改web.config 指定数据库
  1. 运行

    967962-20190129103326688-1381482848.png

  2. 注册

    967962-20190129103418858-195323452.png

可以看见注册成功后对应的数据:

967962-20190129103554708-295971907.png
967962-20190129145216978-1242345718.png

从下面代码可以看见没在注册的时候是通过调用UserManager的CreateAsync方法创建了一个新账号,账号新建成功后通过SignInAsync 完成登录操作,具体的实现逻辑在后续会讲到。

967962-20190129103743543-416815869.png

综上,就可以尝试使用sqlserver存储用户信息的Identity了

使用mysql 的Identity

因为在实际项目中大部分会选择使用mysql 数据库,所以重点讲一下怎么基于MySql 使用Identity

  1. 同sqlserver一样,先新建一个个人用户账户验证的MVC项目

    967962-20190129110440936-1809686101.png

  2. 安装 MySql.Data、MySql.Data.Entity

    967962-20190129111756704-2060102612.png

  3. 修改web.config

  • 连接地址
  • codeConfigurationType,具体原因参见
  1. 运行程序——Specified key was too long; max key length is 767 bytes
    967962-20190129111907554-1519894330.png

导致这个问题产生的原因是在使用的数据库上下文中,添加了两个长度为varchar(256) 的索引,而默认情况下,Mysql InnoDB 引擎单一字段索引的长度最大为 767 字节,当使用UTF-8 编码的情况下占的字节数(256*3=768) 刚好超过

967962-20190129111957039-117765237.png

IdentityDbContext 的源码

967962-20190129112521735-608337368.png

所以我们只能重载IdentityDbContext的OnModelCreating,将用户的UserName 和 角色的Name 的长度修改为255

967962-20190129113102425-20926935.png

protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            if (modelBuilder == null)            {                throw new ArgumentNullException("modelBuilder");            }            var user = modelBuilder.Entity
() .ToTable("AspNetUsers"); user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId); user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId); user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId); user.Property(u => u.UserName) .IsRequired() .HasMaxLength(255) // 修改长度 避免Mysql 索引超出范围 .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true })); user.Property(u => u.Email).HasMaxLength(256); modelBuilder.Entity
() .HasKey(r => new { r.UserId, r.RoleId }) .ToTable("AspNetUserRoles"); modelBuilder.Entity
() .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId }) .ToTable("AspNetUserLogins"); modelBuilder.Entity
() .ToTable("AspNetUserClaims"); var role = modelBuilder.Entity
() .ToTable("AspNetRoles"); role.Property(r => r.Name) .IsRequired() .HasMaxLength(255)// 修改长度 避免Mysql 索引超出范围 .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") { IsUnique = true })); role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId); }
  1. 重新运行
    967962-20190129113343456-1569137927.png

代码参见(Identity):

到这里,基于Mysql 的Identity 新建就完成了,参考地址:

转载于:https://www.cnblogs.com/PenZ/p/10318501.html

你可能感兴趣的文章
【Android】12.4 利用Intent读取图库中的图片
查看>>
【摘】vbs
查看>>
Android 一键直接查看Sqlite数据库数据
查看>>
HDU - 3506 Monkey Party
查看>>
HashMap实现特点——基于JDK文档
查看>>
C语言最后一次作业--总结报告
查看>>
HttpMessageNotWritableException: Could not write JSON: No serializer found for class ****
查看>>
Django中的RESTful
查看>>
jsp中IE与FF(chrome)request参数编码不同
查看>>
asp.net mssqlserver 存储过程
查看>>
KVM
查看>>
jQuery返回顶部代码
查看>>
v-charts
查看>>
需要学习的编程语言
查看>>
(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用
查看>>
1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
查看>>
再谈H5存储问题--浏览器无痕模式不支持
查看>>
JS原型与面向对象总结
查看>>
构建之法阅读笔记04
查看>>
Fixed元素在滚动时会抖动----开启硬件加速
查看>>