一、传统的session登录

在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

在asp.net core中可以简单实现:

   // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
} app.UseHttpsRedirection();
//使用静态文件
app.UseStaticFiles();
//Cookie策略
//app.UseCookiePolicy();
//Session
app.UseSession(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
// template: "{controller=Home}/{action=Index}/{id?}");
//template: "{controller=Home}/{action=Server}/{id?}");
template: "{controller=Login}/{action=SignIn}/{id?}");
});
}
         public IActionResult SignIn(UserModel userModel)
{
if (ModelState.IsValid)
{
//检查用户信息
if (userModel.Username.Equals("yswenli") && userModel.Password.Equals("yswenli"))
{
//记录Session
HttpContext.Session.Set("User", ByteConvertHelper.Object2Bytes(userModel));
//跳转到系统首页
return RedirectToAction("Server", "Home");
}
ViewBag.ErrorInfo = "用户名或密码错误";
return View(userModel);
}
ViewBag.ErrorInfo = ModelState.Values.First().Errors[].ErrorMessage;
return View(userModel);

但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来。

传统session的主要问题如下:

1.服务器压力: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

2.扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。

3.CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

二、基于token的鉴权机制

基于token的鉴权机制是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息,而是基于token去运算而实现鉴权。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为服务实现大规模分布式提供了基础。

上图是一种用token登录的实现方式,类似的还有很多,虽然实现了分布式的登录处理,但是由于不同的系统之间的不同实现,导致开发量剧增。

三、Json web token

这里推荐使用JWT——Json web token(官网链接)。一个典型的JWT看起来如下图:

jwt为一个字符串,字符之间通过"."分隔符分为三个子串。注意JWT对象为一个长字串,各字串之间也没有换行符,此处为了演示需要,特意分行并用不同颜色表示了。每一个子串表示了一个功能块,总共有以下三个部分:JWT头、有效载荷和签名,将它们写成一行如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJpYXQiOjE1OTM5NTU5NDMsInVpZCI6MTAsImV4cCI6MTU5Mzk1NTk3Mywic2NvcGVzIjpbImFkbWluIiwidXNlciJdfQ.VHpxmxKVKpsn2Iytqc_6Z1U1NtiX3EgVki4PmA-J3Pg

一般是将它放入HTTP请求的Header Authorization字段中

Authorization: Bearer

这里可以打开nuget:https://www.nuget.org/packages/JWT.Standard/,或者在vs中使用

输入jwt.standard找到nuget包下载

1.生成jwt数据

在需要使用的地方输入如下C#代码:

var jwtp = new JWTPackage<UserModel>(new UserModel()
{
Id = "",
Name = "yswenli",
Role = "Admin"
}, , _pwd);
var keyValuePair = jwtp.GetAuthorizationBearer();
context.HttpContext.Response.Headers[keyValuePair.Key] = keyValuePair.Value;

这样就将需要的jwt内容信息加入到Http头部中,当然可以使用如下方式,以参数数据的方式传递,从而避免跨域问题

     var password = Guid.NewGuid().ToString("N");

     var jwtp1 = new JWTPackage<User>(new User()
{
Id = "",
Name = "yswenli",
Role = "Admin"
}, , password); var sign = jwtp1.Signature;

2.jwt解析验证

JWTPackage<T>中使用JWTPackage<T>.Parse方法解析jwt的内容,如果内容是header中的参数,则快捷解析验证代码如下:

 var result = string.Empty;
try
{
if (context.HttpContext.Request.Headers.ContainsKey(keyValuePair.Key))
{
var val = context.HttpContext.Request.Headers[keyValuePair.Key].ToString(); val = val.Replace(JWTPackage.Prex, ""); var jwt = JWTPackage<UserModel>.Parse(val, pwd); result = "OK";
}
}
catch (IllegalTokenException iex)
{
result = $"解析失败:{iex.Message}";
}
catch (TokenExpiredException tex)
{
result = $"解析失败:{tex.Message}";
}
catch (SignatureVerificationException sex)
{
result = $"解析失败:{sex.Message}";
}
catch (Exception ex)
{
result = $"解析失败:{ex.Message}";
}
return result;

四、JWT的问题

经过上述的简单介绍,JWT不仅可用于认证,还可用于信息交换,善用JWT有助于减少服务器请求数据的次数。但是如果不正确的使用JWT也会造成安全问题,主要几点如下:

1.保护好secret私钥,加密的密码不能泄漏,否则就失去了签名的意义了

2.Replay Attacks,JWT的消息体中最好加入生成时间,在后端中进行时间判定,小于规定时间的直接拦截

3.不应该在JWT的payload部分存放敏感信息,因为该部分是客户端可解密的部分

4.建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探

转载请标明本文来源:https://www.cnblogs.com/yswenli/p/13510050.html
更多内容欢迎star我的的github:https://github.com/cnwenli/JWT.Net
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

C#分布式登录——jwt的更多相关文章

  1. Java分布式:JWT(JSON Web Tokens)

    Java分布式:JWT(JSON Web Tokens) 0.优势 Session方式存储用户状态占用大量服务器内存.一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存 ...

  2. 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计

    一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...

  3. Oracle本地,远程,分布式登录

    identify认证,确定; identity同一性,个性; 本地连接 sqlplus scott/tiger@localhost:1521/orcl 这句话就等于sqlplus scott/tige ...

  4. 单点登录-JWT(Json Web Tokens)

    来自:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 1.跨域认证 1.用户向服务器发送用户名和密码. 2.服务 ...

  5. CAS单点登录系统入门--分布式登录验证

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  6. 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用

    什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...

  7. 使用JWT来实现单点登录功能

    出处: https://www.cnblogs.com/zexin/p/10389541.html 我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不 ...

  8. 如何使用JWT来实现单点登录功能

    我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不错. 个人理解,jwt就是类似于一把锁和钥匙,客户来租房(登录),我们需要给他进来(第一次登录)登记 ...

  9. OAuth 2和JWT - 如何设计安全的API?

    OAuth 2和JWT - 如何设计安全的API? Moakap译,原文 OAuth 2 VS JSON Web Tokens: How to secure an API 本文会详细描述两种通用的保证 ...

随机推荐

  1. SpringBoot2 整合FreeMarker模板,完成页面静态化处理

    本文源码:GitHub·点这里 || GitEE·点这里 一.页面静态化 1.动静态页面 静态页面 即静态网页,指已经装载好内容HTML页面,无需经过请求服务器数据和编译过程,直接加载到客户浏览器上显 ...

  2. 一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

    一:背景 1. 讲故事 最近因为各方面原因换了一份工作,去了一家主营物联柜的公司,有意思的是物联柜上的终端是用 wpf 写的,代码也算是年久失修,感觉技术债还是蛮重的,前几天在调试一个bug的时候,看 ...

  3. vue手脚架中使用jq

    下载jq npm install jquery; 找到build文件夹下的webpack.base.config.js 先在开始的地方引入webpack const webpack = require ...

  4. web自动化 -- 三种等待方式

    一.强制等待 二.隐式等待 注:隐式等待的作用域是全局,所以一般设置在整局代码的头几行. 如: 三.显示等待 元素存在: 元素可见: 元素可点击: 看到上图源码中有一个   element.is_en ...

  5. 2. 妈呀,Jackson原来是这样写JSON的

    没有人永远18岁,但永远有人18岁.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...

  6. 毫无基础的人入门Python,Python新手入门教程2

    1.6 面向对象和内存分析086.面向对象和面向过程的区别_执行者思维_设计者思维087.对象的进化故事088.类的定义_类和对象的关系089.构造函数__init__090.实例属性_内存分析091 ...

  7. Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘

    百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录  · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...

  8. js 从目标数组中过滤掉 一个数组元素,

    标题描述的有点僵硬,大概需求是,从目标数组中过滤掉我想要删除的元素集合,这里使用的是遍历+过滤器的组合,很方便,做个笔记! let old = ["AE_CN_SUPER_ECONOMY_G ...

  9. spring boot 项目连接数据库查询数据过程

    spring boot 项目搭建 pom.xml <?xml version="1.0" encoding="UTF-8"?> <projec ...

  10. JS的执行上下文

    定义 执行上下文时是代码执行时的环境,JS代码在运行前进行编译,那么会生成两部分,一部分是可执行的代码,而另一部分则是执行上下文. 发展 执行上下文所包含的内容是在不断的变化的.它主要分为了三个不同的 ...