Asp.Net Core中基于Session的身份验证的实现
在asp.net框架中提供了几种身份验证方式:windows身份验证、forms身份验证、passport身份验证(单点登录验证)。
每种验证方式都有适合它的场景:
1.windowss身份验证通常用于企业内部环境,windows active directory就是基于windows平台的身份验证实现;
2.forms身份验证是asp.net框架中提出的另一种验证方式;
3.passport身份验证是微软提供的基于自己的lives账号实现的单点认证服务。
asp.net core验证码登录遇到两个小问题
第一是在asp.net core中引用dll,以往我们引用dll都是直接引用,在core里这样是不行的,必须基于nuget添加,或者基于project.json添加,然后保存vs会启动还原类库。
第二就是使用session的问题,core里使用session需要添加session类库。
第一步:在你的项目上基于nuget添加:
install-package microsoft.aspnetcore.session -ver 2.0 install-package microsoft.aspnetcore.http.extensions -ver 2.0
第二步:修改startup.cs
在startup.cs找到方法configureservices(iservicecollection services) 注入session(这个地方是asp.net core pipeline):
services.addsession();
接下来我们要告诉asp.net core使用内存存储session数据,在configure(iapplicationbuilder app,...)方法中添加代码:
app.usesession();
基于session的身份验证实现
这种方式可能是在asp.net框架提供的几种验证方式之外的最常用的身份验证方式。
实现原理
1.客户端发送身份认证数据到服务器端
2.服务器收到并验证后将用户信息保存到session对象中,然后生成对应的标识并将标识写入cookie中
3.当客户端下次请求时带上该cookie标识
4.服务器通过该cookie标识从session对象中获取对应的用户信息
asp.net core中的session身份认证实现
基于session的身份认证并不是asp.net core中推荐的认证方式,因为asp.net core中有更高级的forms身份认证方式,不过在这里不是本文章的主题,我们只讲如何在asp.net core中实现基于session的身份认证。
我们先创建一个用于代码演示的基础项目
dotnet new razor -n sessionsample
在startup.cs中启用session功能
public class startup { public void configureservices(iservicecollection services) { ... //添加session服务 services.addsession(); } public void configure(iapplicationbuilder app, ihostingenvironment env) { ... //启用session app.usesession(); app.usemvc(); } }
创建一个mypage.cs文件,我们在该类中实现了一个islogin属性,该属性用来判断用户的登陆状态:
public class mypage:pagemodel { protected bool islogin { get { string userid = null; //从sessin中获取userid对应的用户信息来判断用户是否登陆 if (httpcontext.session.trygetvalue("userid", out byte[] bytes)) { userid = encoding.utf8.getstring(bytes); } return !string.isnullorwhitespace(userid); } } }
我们已经实现了验证,现在缺少的是如何在session中添加userid的信息,我们来创建一个login页面:
dotnet new page -n login
public class loginmodel : mypage { public void onget() { if(islogin) { //如果已经登陆就跳转到/index页面 redirecttopage("/index"); } } public iactionresult onpost() { //这里我们将userid写入session中 httpcontext.session.setstring("userid", guid.newguid().tostring()); return redirecttopage("/index"); } }
给现有的页面添加验证功能,打开index页面,添加如下代码:
public class indexmodel : mypage { public iactionresult onget() { if (!islogin) { return redirecttopage("/login"); } return page(); } }
ok!我们已经实现了身份认证。
总结
我们描述了传统asp.net中提供的几种身份认证方式,并在asp.net core实现了一种虽然不标准但是常用的身份认证机,看起了与asp.net中的用法并没有什么区别。
在asp.net core中这种用法似乎并不受欢迎,可能是因为asp.net core提供了更高级的身份验证机制吧,那么这篇文章存在的意义呢?权当做是对asp.net的一种纪念吧!
现在是.net core的时代,让.net洗洗睡吧!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
解读ASP.NET 5 & MVC6系列教程(12):基于Lamda表达式的强类型Routing实现
-
实现在同一方法中获取当前方法中新赋值的session值解决方法
-
(14)ASP.NET Core 中的日志记录
-
基于ASP.NET实现日期转为大写的汉字
-
ASP.NET中GridView 重复表格列合并的实现方法
-
基于innerHTML中的script广告实现代码[广告全部放在一个js里面] 原创
-
Asp.net中处理一个站点不同Web应用共享Session的问题
-
asp.net使用FCK编辑器中的分页符实现长文章分页功能
-
Asp.Net中NHiernate的Session的管理
-
ASP.NET中实现中文简/繁体自动转换的类