先做登陆和退出。
先来复制个登陆页,把之前讲的MVC的项目代码复制过来。
先复制Login.cshtml页面过来,它需要一个CurrentUser对象。
把User类复制过来
把验证码也复制过来
复制过来以后,需要引入一些dll
登陆的逻辑也是复制过来的
首先这里会有一个 get请求来显示登陆的页面
setCookie是自己封装的
httpContext.Response.Cookie本身就有的方法,设置了30分钟的cookie
运行起来的页面
再把_LoginPartial.cshtml复制过来。
获取当前的用户
asp.net core 3.1 cshtml视图页面动态编译
在AddControllersWithViews的后面添加。这样就可以实现view页面的动态编译了。
我们的启动方式,是控制台启动,每次其实还是需要手动的编译代码
登陆成功
验证
控制器登陆后才能访问。先来做一个MVC的模式的
复制CustomExceptionFilterAttribute这个类。
起名叫做CustomActionCheckFilterAttribute.cs
实现ActionFilterAttribute方法,然后重写OnActionExcuting方法
保留日志的注入
把这个方法名,后面加上GetBySession
用TypeFilter外层包一下,可以实现自动注入。
自动跳转到登陆页面
这里跳转的路径有点问题,改一下
跳转的路径跳不过去 是因为之前的课程加的Filter里面缓存的问题,但是我们刷新页面就没问题,但是如果都是新打开tab页面然后输入地址访问的就是从缓存访问
自定义中间件完成验证
引入命名空间
指定cookie的模式
检查没有登陆的话就跳转到Fourth/Login页面
如果没有权限就跳转到home/Privacy
先把刚才出现的缓存先去掉
登陆后初始化
我们做用户登陆后,不再像之前的方式写入cookie和session
用户信息只有一个比较的特别的就是这里的name
这是原来的cookie的写法,30分钟
上面的代码我们就注释掉了。
获取用户信息
在我们的httpContext里面多个东西 ClaimPrincipal
就可以获取到我们的用户信息
view页面获取用户信息
controller验证用户登陆
那么在ThirdController的控制器下面,所有的action请求都会验证。
测试,没有登陆直接访问 Third/info
缓存引起的页面的跳转的错误。缓存是浏览器的缓存,服务器端的代码虽然注释掉了,但是浏览器端的缓存还没有被清理掉。
Chrome浏览器清除缓存。
清除缓存后
自动跳转到了登陆页面
如果没有登陆跳转的页面是我们在startup里面指定的。
登陆
登陆成功
我们之前的判断自己写的cookie和session未登陆的地方也要注释掉
注销操作
把之前写的注入的代码都引入进来。
HttpContext自带了SingoutAsync的方法。
测试登陆和注销的过程。登陆手动打开fourth/index和info的页面。 注销后再测试
cookie的解析和验证都是Authentication模块封装好的
【Authorize】
这里面只有三个属性,
policy
Policy和Roles客户个demo自己抄一下。不再课堂上讲了
这几种方式,永远都是依赖于Cookie和Session的
回答问题
把这段代码的注释先放开。这里如果前面使用了Use那么 next.Invoke的时候,是不是会和.net core的其他中间件串起来。
启动程序,访问报错
因为在自己的Use里面使用了Response.write输出引起的这个错误,在后湖面的MVC管道已经输出了,这里next.Invoke又操作就会引起错误。
这里可以输出到控制台,使用Conole.writeLine
z在前面也不能用Response.Write。你写了MVC就写不了了
想要写的话 只能在Response的OnStarting事件里面去指定。
最终代码
研究完这个问题,代码再注释掉。
Entity Framework Core
创建一个EF的类库
在做查询的时候,这里面会有一些数据的支撑?
然后还要引入Sql server的类库
直接拿过来之前课程的代码,这里就不再写了。
把所有的命名空间都统一I下
这样这里的SetBasePath就不报错了。
它是在这个包的下面的
在OnConfigurting里面指定连接字符串。
在配置文件内加上连接字符串
web引用类库
view绑定数据
我们在创建web项目的时候,默认会自动添加EF的库,而且版本和我们当前的的库引用的版本是不一样的。
选择后安装,这就相当于安装了同样的一个版本。
先搞Sql server的这个类
在搞这个EF Core
这里告诉我们要通过ServiceProvider
缺少了这句话。获取到了链接富川 但是没有给数据库设置上用这个链接字符串。
又报一个错误
注入的方式使用EFCore
这里是做其他的配置信息的,要不要都可以。这里可以去掉。
这里我们去掉
链接字符串一定要配置正确了
在我们的DbContext类里面,这一段代码都可以注释掉了。 主要的是UseSqlServer这一段话。
我们可以看下,DbContext的这里的构造函数需要一个DbContextOptions的参数。
分别在控制台输出测试
这里还是不能要,注释掉
这样这里就不能直接New出来这个JDDbcontext对象来使用了。 应该是需要注入进来才行。
注入DbContext
注入的方式试试
使用AddScoped这种方式注册服务到IOC容器
那么就要用这个无参数的构造函数,下面带参数的构造函数注释掉代码。
注入还是在构造函数这里注入
找出错误
这里在构造的时候需要把传递用base传递给父类
之类先不要异常处理了,把异常处理的Filter注释掉。
这里要是一个泛型的形式
这里的异常的Filter再打开
再来捋一遍流程
跳过这一段代码,注入还是应这个方式来应付一下。
dbContext在狗仔函数内注入和放在Action里面的差别
前端输出
编译,运行代码
构造函数的问题
同时用外面的dbcontext和里面的
抛出了一个异常是一个对象的释放异常
也就是说dbContext被释放,但是又用了他
这里new出来或者是用容器Serviceprovider去New出来。
这里用using释放的明显一点。
释放之后,界面再去延迟绑定的时候
绑定的时候会去找UserList1。但是其实没有执行。因为它是延迟查询,等到它真的去查询的时候,已经被dispose掉了。
这里注释掉。
声明周期不一样
这里如果toList的话就是直接查询出来了,就没有这个问题了。
配置文件和options的指定,这里不用这么去写了了
构造函数注入IConfiguration
着这里打印个日志表示从这里进来的
这里的名称写的不对
控制台输出了一堆信息,
这是因为引入了LoggerFactory。但是输出了很多的信息,并不是我们想要看的
Logger扩展输出SQL
如果想要输出数据库查询的sql。这就用到一个扩展
核心就是CreateLogger怎么去生成Logger。这里我们自己写了一个 CustomEFLogger
最主要的就是写日志的方法。异常信息,查询的sql都输出
ILogger里面主要就是这个Log的方法
但是讲着 控制台并没有输出。又继续讲下面了。
分层封装
service层
这里就可以引用到了。
批量替换命名空间
替换成当前项目的
Service层也引用一下
做单表查询,以前是用的SqlQuery,这里改成了FormSqlRaw。做单表查询的。
这里ExecutedCommand现在改成了ExecuteSqlRaw
这样我们在Controller里面就是用UserService的方式,就不需要直接注入DbContext了。
注入IOC容器
Service里面注入了DbContext
结束