C#基于jwt实现分布式登录

一、传统的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?}");
   });
  }

但是这种基于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 = "1",
 Name = "yswenli",
 Role = "Admin"
}, 180, _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 = "1",
  Name = "yswenli",
  Role = "Admin"
 }, 180, 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协议),从而避免敏感信息被嗅探

以上就是C#基于jwt实现分布式登录 的详细内容,更多关于c# 实现分布式登录 的资料请关注我们其它相关文章!

(0)

相关推荐

  • c#关于JWT跨域身份验证的实现代码

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519), 该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息, 以便于从资源服务器获取资源,该token也可直接被用于认证,也可被加密. 一.JWT的组成 下面是JWT的一段示例,分为三个部分,分别是头部(header),载荷(payload)}和签

  • C#基于jwt实现分布式登录

    一.传统的session登录 在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证. 在asp.net core中可以简单实现: // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void

  • spring boot如何基于JWT实现单点登录详解

    前言 最近我们组要给负责的一个管理系统 A 集成另外一个系统 B,为了让用户使用更加便捷,避免多个系统重复登录,希望能够达到这样的效果--用户只需登录一次就能够在这两个系统中进行操作.很明显这就是单点登录(Single Sign-On)达到的效果,正好可以明目张胆的学一波单点登录知识. 本篇主要内容如下: SSO 介绍 SSO 的几种实现方式对比 基于 JWT 的 spring boot 单点登录实战 注意: SSO 这个概念已经出现很久很久了,目前各种平台都有非常成熟的实现,比如OpenSSO

  • Spring Security基于JWT实现SSO单点登录详解

    SSO :同一个帐号在同一个公司不同系统上登陆 使用SpringSecurity实现类似于SSO登陆系统是十分简单的 下面我就搭建一个DEMO 首先来看看目录的结构 其中sso-demo是父工程项目 sso-client .sso-client2分别对应2个资源服务器,sso-server是认证服务器 引入的pom文件 sso-demo <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q

  • 基于JWT实现SSO单点登录流程图解

    一.基于JWT实现SSO单点登录原理 1.什么是单点登录 所谓单点登录就是有多个应用部署在不同的服务器上,只需登录一次就可以互相访问不同服务器上的资源. 2.单点登录流程 当一个访问请求发给应用A,如果这个请求需要登录以后才能访问,那么应用A就会向认证服务器请求授权,这时候就把用户引导到认证服务器上.用户在认证服务器上完成认证并授权.认证授权完成后,认证服务器返回给应用A一个授权码,应用A携带授权码到认证服务器请求令牌,认证服务器返回应用A一个JWT,应用A解析JWT里面的信息,完成登录.这是一

  • SpringSecurity构建基于JWT的登录认证实现

    最近项目的登录验证部分,采用了 JWT 验证的方式.并且既然采用了 Spring Boot 框架,验证和权限管理这部分,就自然用了 Spring Security.这里记录一下具体实现. 在项目采用 JWT 方案前,有必要先了解它的特性和适用场景,毕竟软件工程里,没有银弹.只有合适的场景,没有万精油的方案. 一言以蔽之,JWT 可以携带非敏感信息,并具有不可篡改性.可以通过验证是否被篡改,以及读取信息内容,完成网络认证的三个问题:"你是谁"."你有哪些权限".&qu

  • AntDesign Pro + .NET Core 实现基于JWT的登录认证功能

    很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做为基础样式.前台框架也是使用了angularjs,同样是老掉牙的东西.过年期间终于下决心翻新AgileConfig的前端UI.最后选择的前端UI框架为AntDesign Pro + React.至于为啥选Ant-Design Pro是因为他好看,而且流行,选择React是因为VUE跟Angular我

  • django使用JWT保存用户登录信息

    在使用前必须弄明白JWT的相关知识,可以看我的另一篇博文:https://www.jb51.net/article/166843.htm 什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑

  • SpringBoot集成Spring Security用JWT令牌实现登录和鉴权的方法

    最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细 有的是需要在application.yml里进行jwt的配置 但我在导包后并没有相应的配置项 因而并不适用 在踩过很多坑之后 稍微整理了一下 做个笔记 一.概念 1.什么是JWT Json Web Token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519) 该token被设计为紧凑且安全的 特别适用于分布式站点的单点登录(SSO)场景 随着JWT的出现 使得校验方式更加简单便

  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的验证,shiro框架专门用于处理权限方面的,另一个比较流行的后端框架是Spring-Security,该框架提供了一整套比较成熟,也很完整的机制用于处理各类场景下的可以基于权限,资源路径,以及授权方面的解决方案,部分模块支持定制化,而且在和oauth2.0进行了很好的无缝连接,在移动互联网的授权认证方面有很强的优势,具体的使用大家可以结合自己的业务场景进行选

  • SpringBoot JWT实现token登录刷新功能

    目录 1. 什么是JWT 2. JWT组成部分 3. JWT加密方式 4.实战 5.总结 1. 什么是JWT Json web token (JWT) 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.简答理解就是一个身份凭证,用于服务识别. JWT本身是无状态的,这点有别于传统的session,不在服务端存储凭证.这种特性使其在分布式场景,更便于扩展使用. 2. JWT组成部分 JWT有三部分组成,头部(header),载荷(payload),是签名(signature). 头

随机推荐