首页 > 编程语言 >ASP.NET Core Identity 系列之一

ASP.NET Core Identity 系列之一

时间:2023-06-19 22:26:22浏览次数:53  
标签:Core ASP 数据库 用户 NET Identity

转自:https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247486141&idx=1&sn=f77635080994c6295cb801e846427a15
桂迹,微信公众号
https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247486318&idx=1&sn=1f06f6de690ba6df16ed812de9588709

ASP.NET Core Identity提供给我们一组工具包和API,它能帮助我们应用程序创建授权和认证功能,也可以用它创建账户并使用用户名和密码进行登录,同时也提供了角色和角色管理功能。ASP.NET Core Identity使用SQL Server/第三方数据库存储用户名和密码,角色和配置数据

这系列中我们主要使用VS中自带的LocalDB作为演示,你也可以直接从官网上进行下载:https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver16

1. 创建项目

理解ASP.NET Core Identity最好的方法是通过一个项目学习,我们创建一个ASP.NET Core MVC 项目,名字叫Identity,接下来,我们将配置该项目并且安装必要的包

2. 配置项目

安装下列NuGet包
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer

image

3. 配置项目

在Program.cs类中添加认证和授权中间件,在app.UseRouting后面添加如下代码:

app.UseAuthentication();
app.UseAuthorization();

4. 设置ASP.NET Core Identity

ASP.NET Core Identity整个设置过程包括创建新的Model类、配置更改、Controller和Action支持身份验证和授权的操作

4.1 User类

User类表示应用程序中的用户,这些用户数据存储在数据库中,User类继承自IdentityUser类,位于命名空间Microsoft.AspNetCore.Identity中,在Models文件夹下创建AppUser.cs类

namespace Identity.Models{
       public class AppUser : IdentityUser{}
}

AppUser类没有包含任何方法,这是因为IdentityUser类中提供了一些用户属性像用户名,电子邮件,电话,密码hash值等

如果IdentityUser类不能满足你的要求,你可以在AppUser中添加自己定义的属性,我们会在后面介绍

IdentityUser 类定义如下常用属性:

名称 描述
Id 用户唯一ID
UserName 用户名称
Email 用户Email
PasswordHash 用户密码的Hash值
PhoneNumber 用户电话号码
SecurityStamp 当每次用户的数据修改时生成随机值

4.2 创建DataBase Context

DataBase Context类继承自IdentityDbContext<T>类,T表示User类,在应用程序中使用AppUserIdentityDbContext通过使用Entity Framework Core和数据库进行交互

在Models文件夹下创建一个AppIdentityDbContext类并继承IdentityDbContext<AppUser>类,如下代码:

namespace Identity.Models{
   public class AppIdentityDbContext: IdentityDbContext<AppUser>
    {
        public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options):
            base(options)
        { }
    }
}

4.3 创建数据库字符串链接

ASP.NET Core Identity 数据库连接字符串包含数据库名,用户名,密码。通常存储在appsettings.json文件中,这个文件位于根目录下

项目已经包含了这个文件,添加下面配置在你的 appsettings.json 文件中

"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=IdentityDB;Trusted_Connection=True;MultipleActiveResultSets=true"
}

连接字符串中Server指定SQL Server的LocalDB,Database指定数据库名称IdentityDB,你也可以起个别的名字

Trusted_Connection 设置为ture,项目通过使用windows认证链接到数据库,因此我们不需要提供用户名和密码

MultipleActiveResultSets 该特性表示允许在单个连接中执行多个批处理,使SQL语句执行更快,因此我们将它设置成true,MultipleActiveResultSets=true

使用AddDbContext()方法添加AppIdentityDbContext类并且指定它使用SQL Server数据库,连接字符串通过配置文件中获取

builder.Services.AddDbContext<AppIdentityDbContext>(
    options =>options.UseSqlServer(builder.Configuration["ConnectionStrings:DefaultConnection"])
);

5. 添加ASP.NET Core Identity服务

现在我们配置一下ASP.NET Core Identity 相关服务,代码如下:

builder.Services.AddIdentity<AppUser, IdentityRole>().
	AddEntityFrameworkStores<AppIdentityDbContext>().
	AddDefaultTokenProviders();
  • AddIdentity方法的参数类型指定AppUser类和IdentityRole类
  • AddEntityFrameworkStores方法指定Identity使用EF Core作为存储和项目中使用AppIdentityContext作为DB Context
  • AddDefaultTokenProviders方法添加默认Token提供程序,针对重置密码,电话号码和邮件变更操作以及生成双因子认证的
    token,这部分我们后面会介绍

我们前面添加了app.UseAuthentication()方法,经过这个方法的每个HTTP请求会将用户的凭据将添加到Cookie或URL中。这使得用户和他发送的HTTP请求就会产生关联。

6. 使用EF Migration 命令创建Identity 数据库

现在我们使用Entity Framework Core Migration 命令来创建Identity数据库(我们使用第二种方式)

我们在程序包管理器控制台中运行Migration 命令, 你需要安装对应.NET Core CLI,通过下面命令可以安装:

dotnet tool install --global dotnet-ef

接下来我们需要进入 .csproj 项目文件所在的目录。我们在程序包管理器控制台中运行dir来查看当前所在目录。我们可以看到当前目录不是项目所在目录,而是Identity.sIn
image

项目文件位于Identity文件夹内,使用 cd ./Identity 进入该文件夹。我们再次运行 dir 命令,显示我们当前所在的目录是 Identity.csproj 文件所在目录:
image

现在我们运行 EF Core Migration 命令

第一个命令:

dotnet ef migrations add InitDBCommand

上面的命令需要几秒钟完成,完成之后,我们可以在Migrations文件夹能看到生成的文件,文件中包含表的定义。

第二个命令:

dotnet ef database update

上面命令将创建数据库以及表,执行完成这个命令我们就可以看到我们表结构。

第二种方法我们可以不使用.NET Core CLI命令,微软给我提供了一个包Microsoft.EntityFrameworkCore.Tools。该包提供一些命令帮助我们生成数据库和表,在程序包管理控制台中运行如下两个命令:

Add-Migration InitDBCommand 	--创建Migration
Update-Database          		--将Migration 更新到数据库

7. ASP.NET Core Identity 数据库

我们查看一下刚才创建的数据库
image
注意:我们在Visual Studio 菜单找到视图菜单并且打开SQL Server 对象资源管理器

Identity 数据库总共有8张表,这些表包含用户记录,角色,Claims,token和登录次数详细信息等
image

我们看一下每张表的作用:

  • _EFMigrationsHistory – 包含了前面所有的Migration
  • AspNetRoleClaims – 按照角色存储Claims
  • AspNetRoles – 存储所有的角色
  • AspNetUserClaims – 存储用户的Claims
  • AspNetUserLogins –存储用户的登录次数
  • AspNetUserRoles – 存储用户对应的角色
  • AspNetUsers – 存储所有用户
  • AspNetUserTokens – 存储外部认证的token

8. 总结

这节我们主要介绍了如何配置ASP.NET Core Identity,我们现在可以添加用户,管理用户,添加角色,添加用户到角色,用户认证,Identity可以帮助我们做很多工作,我们在下节继续介绍。

源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/AspNetCore.Identity/Identity

标签:Core,ASP,数据库,用户,NET,Identity
From: https://www.cnblogs.com/Ceri/p/17492359.html

相关文章

  • Nashorn引擎导致metaspace oom
       从报错内容很清楚是Metaspace区域oom了大部分情况下,程序运行中不会出现过多的类加载数量的变动,先导入dump文件检查是否有异常的classLoader或者有异常动态生成的class发现了下面这个classLoader数量异常,项目中用到nashorn这块js引擎来做动态js脚本执行通过查阅nas......
  • calico 网络流量 过程 分析 apt-get install telnet
    1.caliconode容器在kubernetes中以DaemonSet的方式运行,容器的网络模式为hostNetwor,与host共享网络栈,拥有相同的Ip和hostname 2.查看某个pod:[root@bserver40~]#kubectlgetpods-owide-nkube-system|grep-itillertiller-deploy-5dfffddb8d-n4vp6 1/1    Runn......
  • Kubernetes哪一点最打动你?或者,它发布过的哪一项特性让你认为最厉害?
    kubernates打动我的地方应该是他解决了docker的一个痛点,各个docker之间的通信以及集成管理。因为这跟微服务很像,微服务之间也是需要通信和统一管理。知识总是相同的,在这里就体现出来了。用一个例子来演示会更加清晰......
  • kubernetes 生命周期问题分析
    1.Failed --pod里至少一个容器以非0code退出,说明应用有问题,需要debug应用容器2.pending--说明API对象已经被创建和保存在etcd数据库里,但是创建过程出了问题,可能是imagepull出问题,也可能是调度出了问题3.Unknow--说明pod的状态不能持续地被Kubelet发送给kubeapi,这很可能是......
  • kubernetes 资源请求和限制
    1.spec:containers:-name:exampleresources:requests:cpu:100mmemory:64Milimits:cpu:200mmemory:128Mi   例如,一个带有3个容器的pod,每个容器请求0......
  • kubernetes pvc pv 坑
    这里遇到一个问题,开始建立的pv死活claim为空,查看pv以及pvc的配置发现并没有任何名称上的关联,继续研究,发现纯粹是通过storage大小进行匹配的,之前因为照抄书本,一个是5G,一个是8G所以就无法匹配了,修改后成功。用一个例子来演示会更加清晰......
  • .Net Core Mvc 2. VS2022 + Core6.0 + Mvc 添加视图,传递数据
    添加视图找到控制器HelloWorldController的叫Index的Action在上面右键,选择添加视图,选择空,确认后会在Views文件夹下新建一个HelloWorld文件夹,并生成Index.cshtml文件。直接运行 可以看到Index视图有默认的头部内容和底部内容(太长了没截取),这个效果是在Views\Shared文件夹下的_......
  • Kubernetes——存储
    目录Volume分类示例1:通过emptyDir共享数据示例2:使用HostPath挂载宿主机文件示例3:挂载NFS至容器PersistentVolume基于NFS的PV基于HostPath的PV基于CephRBD的PVPersistentVolumeClaim创建PVC使用PVC动态存储StorageClass定义StorageClass整合StorageClass和CephRBDCSI容器存储接口......
  • 在.Net Core6中使用log4net组件写日志到本地文件的操作流程
    原文链接:https://blog.csdn.net/kevin860/article/details/1068810621.引用包: Log4Net  Microsoft.Extensions.Logging.Log4Net.AspNetCore Microsoft.Extensions.Logging //loggingbuilder.AddFilter该方法需要引入Microsoft.Extensions.Logging名称空间 ......
  • SNN-RAT: Robustness-enhanced Spiking Neural Network through Regularized Adversar
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!同大组工作 Abstract ......