Asp.NetCore3.1-4

先做登陆和退出。

先来复制个登陆页,把之前讲的MVC的项目代码复制过来。
先复制Login.cshtml页面过来,它需要一个CurrentUser对象。
Asp.NetCore3.1-4
把User类复制过来
Asp.NetCore3.1-4
把验证码也复制过来
Asp.NetCore3.1-4
复制过来以后,需要引入一些dll
Asp.NetCore3.1-4
 
Asp.NetCore3.1-4
登陆的逻辑也是复制过来的
Asp.NetCore3.1-4
首先这里会有一个 get请求来显示登陆的页面
Asp.NetCore3.1-4

setCookie是自己封装的
Asp.NetCore3.1-4
httpContext.Response.Cookie本身就有的方法,设置了30分钟的cookie
Asp.NetCore3.1-4
运行起来的页面
Asp.NetCore3.1-4
再把_LoginPartial.cshtml复制过来。
Asp.NetCore3.1-4
获取当前的用户
Asp.NetCore3.1-4

Asp.NetCore3.1-4
在AddControllersWithViews的后面添加。这样就可以实现view页面的动态编译了。 
Asp.NetCore3.1-4
我们的启动方式,是控制台启动,每次其实还是需要手动的编译代码
Asp.NetCore3.1-4
登陆成功
Asp.NetCore3.1-4

验证

控制器登陆后才能访问。先来做一个MVC的模式的
复制CustomExceptionFilterAttribute这个类。
Asp.NetCore3.1-4
起名叫做CustomActionCheckFilterAttribute.cs
Asp.NetCore3.1-4
实现ActionFilterAttribute方法,然后重写OnActionExcuting方法
Asp.NetCore3.1-4
保留日志的注入
Asp.NetCore3.1-4
把这个方法名,后面加上GetBySession
Asp.NetCore3.1-4
用TypeFilter外层包一下,可以实现自动注入。
Asp.NetCore3.1-4
自动跳转到登陆页面
Asp.NetCore3.1-4

这里跳转的路径有点问题,改一下
Asp.NetCore3.1-4
跳转的路径跳不过去 是因为之前的课程加的Filter里面缓存的问题,但是我们刷新页面就没问题,但是如果都是新打开tab页面然后输入地址访问的就是从缓存访问
Asp.NetCore3.1-4

自定义中间件完成验证


Asp.NetCore3.1-4
引入命名空间
Asp.NetCore3.1-4
指定cookie的模式
Asp.NetCore3.1-4
检查没有登陆的话就跳转到Fourth/Login页面
Asp.NetCore3.1-4

如果没有权限就跳转到home/Privacy
Asp.NetCore3.1-4
先把刚才出现的缓存先去掉
Asp.NetCore3.1-4

登陆后初始化

我们做用户登陆后,不再像之前的方式写入cookie和session
Asp.NetCore3.1-4
用户信息只有一个比较的特别的就是这里的name
Asp.NetCore3.1-4
这是原来的cookie的写法,30分钟
Asp.NetCore3.1-4
上面的代码我们就注释掉了。
Asp.NetCore3.1-4

获取用户信息

在我们的httpContext里面多个东西 ClaimPrincipal
Asp.NetCore3.1-4
就可以获取到我们的用户信息

Asp.NetCore3.1-4

view页面获取用户信息

Asp.NetCore3.1-4
controller验证用户登陆
Asp.NetCore3.1-4
那么在ThirdController的控制器下面,所有的action请求都会验证。
Asp.NetCore3.1-4
测试,没有登陆直接访问 Third/info
Asp.NetCore3.1-4
缓存引起的页面的跳转的错误。缓存是浏览器的缓存,服务器端的代码虽然注释掉了,但是浏览器端的缓存还没有被清理掉。
Asp.NetCore3.1-4

Chrome浏览器清除缓存。
Asp.NetCore3.1-4

清除缓存后
Asp.NetCore3.1-4

自动跳转到了登陆页面
Asp.NetCore3.1-4
如果没有登陆跳转的页面是我们在startup里面指定的。
Asp.NetCore3.1-4
登陆
Asp.NetCore3.1-4
登陆成功
Asp.NetCore3.1-4

我们之前的判断自己写的cookie和session未登陆的地方也要注释掉
Asp.NetCore3.1-4

注销操作

把之前写的注入的代码都引入进来。
Asp.NetCore3.1-4
HttpContext自带了SingoutAsync的方法。
Asp.NetCore3.1-4
测试登陆和注销的过程。登陆手动打开fourth/index和info的页面。 注销后再测试

cookie的解析和验证都是Authentication模块封装好的
Asp.NetCore3.1-4

【Authorize】

这里面只有三个属性,
Asp.NetCore3.1-4

policy

Policy和Roles客户个demo自己抄一下。不再课堂上讲了
Asp.NetCore3.1-4

这几种方式,永远都是依赖于Cookie和Session的
Asp.NetCore3.1-4

回答问题

把这段代码的注释先放开。这里如果前面使用了Use那么 next.Invoke的时候,是不是会和.net core的其他中间件串起来。
Asp.NetCore3.1-4
启动程序,访问报错
Asp.NetCore3.1-4
因为在自己的Use里面使用了Response.write输出引起的这个错误,在后湖面的MVC管道已经输出了,这里next.Invoke又操作就会引起错误。
这里可以输出到控制台,使用Conole.writeLine
Asp.NetCore3.1-4
z在前面也不能用Response.Write。你写了MVC就写不了了
Asp.NetCore3.1-4
想要写的话 只能在Response的OnStarting事件里面去指定。
Asp.NetCore3.1-4
最终代码
Asp.NetCore3.1-4
研究完这个问题,代码再注释掉。
Asp.NetCore3.1-4

Entity Framework Core

创建一个EF的类库
Asp.NetCore3.1-4
在做查询的时候,这里面会有一些数据的支撑?
Asp.NetCore3.1-4
然后还要引入Sql server的类库
Asp.NetCore3.1-4
直接拿过来之前课程的代码,这里就不再写了。
Asp.NetCore3.1-4
把所有的命名空间都统一I下
Asp.NetCore3.1-4

这样这里的SetBasePath就不报错了。
Asp.NetCore3.1-4

它是在这个包的下面的
Asp.NetCore3.1-4
在OnConfigurting里面指定连接字符串。
Asp.NetCore3.1-4
在配置文件内加上连接字符串
Asp.NetCore3.1-4
web引用类库
Asp.NetCore3.1-4
view绑定数据
Asp.NetCore3.1-4
我们在创建web项目的时候,默认会自动添加EF的库,而且版本和我们当前的的库引用的版本是不一样的。
Asp.NetCore3.1-4
选择后安装,这就相当于安装了同样的一个版本。
先搞Sql server的这个类
Asp.NetCore3.1-4
在搞这个EF Core
Asp.NetCore3.1-4
这里告诉我们要通过ServiceProvider
Asp.NetCore3.1-4
缺少了这句话。获取到了链接富川 但是没有给数据库设置上用这个链接字符串。
Asp.NetCore3.1-4
又报一个错误
Asp.NetCore3.1-4

注入的方式使用EFCore


Asp.NetCore3.1-4
这里是做其他的配置信息的,要不要都可以。这里可以去掉。
Asp.NetCore3.1-4
这里我们去掉
Asp.NetCore3.1-4
链接字符串一定要配置正确了
Asp.NetCore3.1-4

在我们的DbContext类里面,这一段代码都可以注释掉了。 主要的是UseSqlServer这一段话。
Asp.NetCore3.1-4
分别在控制台输出测试
Asp.NetCore3.1-4

这里还是不能要,注释掉
Asp.NetCore3.1-4
这样这里就不能直接New出来这个JDDbcontext对象来使用了。 应该是需要注入进来才行。
Asp.NetCore3.1-4
注入DbContext
Asp.NetCore3.1-4

注入的方式试试

使用AddScoped这种方式注册服务到IOC容器
Asp.NetCore3.1-4
那么就要用这个无参数的构造函数,下面带参数的构造函数注释掉代码。
Asp.NetCore3.1-4

注入还是在构造函数这里注入
Asp.NetCore3.1-4

找出错误

Asp.NetCore3.1-4
这里在构造的时候需要把传递用base传递给父类
Asp.NetCore3.1-4
之类先不要异常处理了,把异常处理的Filter注释掉。
Asp.NetCore3.1-4

这里要是一个泛型的形式
Asp.NetCore3.1-4
这里的异常的Filter再打开
Asp.NetCore3.1-4

再来捋一遍流程

Asp.NetCore3.1-4
跳过这一段代码,注入还是应这个方式来应付一下。
Asp.NetCore3.1-4

dbContext在狗仔函数内注入和放在Action里面的差别

Asp.NetCore3.1-4
前端输出
Asp.NetCore3.1-4
编译,运行代码
Asp.NetCore3.1-4
构造函数的问题
Asp.NetCore3.1-4

同时用外面的dbcontext和里面的
Asp.NetCore3.1-4

抛出了一个异常是一个对象的释放异常
Asp.NetCore3.1-4
也就是说dbContext被释放,但是又用了他
Asp.NetCore3.1-4
这里new出来或者是用容器Serviceprovider去New出来。
Asp.NetCore3.1-4
这里用using释放的明显一点。
Asp.NetCore3.1-4
释放之后,界面再去延迟绑定的时候
Asp.NetCore3.1-4
绑定的时候会去找UserList1。但是其实没有执行。因为它是延迟查询,等到它真的去查询的时候,已经被dispose掉了。
Asp.NetCore3.1-4
这里注释掉。
Asp.NetCore3.1-4
声明周期不一样
Asp.NetCore3.1-4
这里如果toList的话就是直接查询出来了,就没有这个问题了。
Asp.NetCore3.1-4

配置文件和options的指定,这里不用这么去写了了
Asp.NetCore3.1-4
构造函数注入IConfiguration  
Asp.NetCore3.1-4

着这里打印个日志表示从这里进来的
Asp.NetCore3.1-4
这里的名称写的不对
Asp.NetCore3.1-4
控制台输出了一堆信息,
Asp.NetCore3.1-4
这是因为引入了LoggerFactory。但是输出了很多的信息,并不是我们想要看的
Asp.NetCore3.1-4

Logger扩展输出SQL

如果想要输出数据库查询的sql。这就用到一个扩展
Asp.NetCore3.1-4
核心就是CreateLogger怎么去生成Logger。这里我们自己写了一个 CustomEFLogger
Asp.NetCore3.1-4
最主要的就是写日志的方法。异常信息,查询的sql都输出
Asp.NetCore3.1-4
ILogger里面主要就是这个Log的方法
Asp.NetCore3.1-4
但是讲着 控制台并没有输出。又继续讲下面了。

分层封装

service层
Asp.NetCore3.1-4
这里就可以引用到了。
Asp.NetCore3.1-4
批量替换命名空间
Asp.NetCore3.1-4
替换成当前项目的
Asp.NetCore3.1-4

Service层也引用一下
Asp.NetCore3.1-4

做单表查询,以前是用的SqlQuery,这里改成了FormSqlRaw。做单表查询的。
Asp.NetCore3.1-4
这里ExecutedCommand现在改成了ExecuteSqlRaw
Asp.NetCore3.1-4
这样我们在Controller里面就是用UserService的方式,就不需要直接注入DbContext了。
Asp.NetCore3.1-4

注入IOC容器


Asp.NetCore3.1-4
Service里面注入了DbContext
Asp.NetCore3.1-4

结束

 

相关文章: