经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Asp.Net Core中基于Session的身份验证的实现
来源:jb51  时间:2018/9/25 19:03:53  对本文有异议

在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添加:

  1. install-package Microsoft.AspNetCore.Session -ver 2.0
  2.  
  3. install-package Microsoft.AspNetCore.Http.Extensions -ver 2.0

第二步:修改startup.cs

在startup.cs找到方法ConfigureServices(IServiceCollection services) 注入Session(这个地方是Asp.net Core pipeline):

  1. services.AddSession();

接下来我们要告诉Asp.net Core使用内存存储Session数据,在Configure(IApplicationBuilder app,...)方法中添加代码:

  1. 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的身份认证。

我们先创建一个用于代码演示的基础项目

  1. dotnet new razor -n SessionSample

在startup.cs中启用session功能

  1. public class Startup
  2. {
  3. public void ConfigureServices(IServiceCollection services)
  4. {
  5. ...
  6. //添加session服务
  7. services.AddSession();
  8. }
  9. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  10. {
  11. ...
  12. //启用session
  13. app.UseSession();
  14. app.UseMvc();
  15. }
  16. }

创建一个MyPage.cs文件,我们在该类中实现了一个IsLogin属性,该属性用来判断用户的登陆状态:

  1. public class MyPage:PageModel
  2. {
  3. protected bool IsLogin
  4. {
  5. get
  6. {
  7. string userId = null;
  8. //从sessin中获取UserId对应的用户信息来判断用户是否登陆
  9. if (HttpContext.Session.TryGetValue("UserId", out byte[] bytes))
  10. {
  11. userId = Encoding.UTF8.GetString(bytes);
  12. }
  13. return !string.IsNullOrWhiteSpace(userId);
  14. }
  15. }
  16. }

我们已经实现了验证,现在缺少的是如何在session中添加UserId的信息,我们来创建一个Login页面:

  1. dotnet new page -n Login
  1. public class LoginModel : MyPage
  2. {
  3. public void OnGet()
  4. {
  5. if(IsLogin)
  6. {
  7. //如果已经登陆就跳转到/Index页面
  8. RedirectToPage("/Index");
  9. }
  10. }
  11. public IActionResult OnPost()
  12. {
  13. //这里我们将UserId写入session中
  14. HttpContext.Session.SetString("UserId", Guid.NewGuid().ToString());
  15. return RedirectToPage("/Index");
  16. }
  17. }
  18.  

给现有的页面添加验证功能,打开Index页面,添加如下代码:

  1. public class IndexModel : MyPage
  2. {
  3. public IActionResult OnGet()
  4. {
  5. if (!IsLogin)
  6. {
  7. return RedirectToPage("/Login");
  8. }
  9. return Page();
  10. }
  11. }

OK!我们已经实现了身份认证。

源代码

总结

​ 我们描述了传统Asp.Net中提供的几种身份认证方式,并在Asp.Net Core实现了一种虽然不标准但是常用的身份认证机,看起了与Asp.Net中的用法并没有什么区别。

​ 在Asp.Net Core中这种用法似乎并不受欢迎,可能是因为Asp.Net Core提供了更高级的身份验证机制吧,那么这篇文章存在的意义呢?权当做是对Asp.Net的一种纪念吧!

现在是.net core的时代,让.net洗洗睡吧!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号