怎么在c#中利用jwt实现一个分布式登录功能吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一、传统的会话登录
在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为饼干,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于会话认证。
在asp.net核心中可以简单实现:
//,却;能够method gets nbsp; by 从而运行时只Use 却;能够method 用configure 从而HTTP request 管道。 public 才能;void 配置(IApplicationBuilder 应用,IHostingEnvironment env) {才能 ,,if (env.IsDevelopment ()) ,,{ ,,,app.UseDeveloperExceptionPage (); ,,} 其他的,, ,,{ ,,,app.UseExceptionHandler (“/Home/Error"); ,,,app.UseHsts (); ,,} ,,app.UseHttpsRedirection (); ,//才能使用静态文件 ,,app.UseStaticFiles (); ,,//Cookie策略 ,,//app.UseCookiePolicy (); ,,//会话 ,,app.UseSession (); ,,app.UseMvc (routes =比; ,,{ ,,,routes.MapRoute ( ,,,,名字:,“default", ,,,,//,模板:,“{控制器=回家}/{action=指数}/{id ?}“); ,,,,//模板:,“{控制器=回家}/{action=服务器}/{id ?}“); ,,,,模板:,“{控制器=登录}/{action=SignIn}/{id ?}“); ,,}); 以前,,}>但是这种基于会话的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于会话认证应用的问题就会暴露出来。
传统会话的主要问题如下:
1。服务器压力:每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言会话都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
2。扩展性:用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
3。CSRF:因为是基于饼干来进行用户识别的,饼干如果被截获,用户就会很容易受到跨站请求伪造的攻击。
二,基于令牌的鉴权机制
基于令牌的鉴权机制是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息,而是基于令牌去运算而实现鉴权。这就意味着基于令牌认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为服务实现大规模分布式提供了基础。
上图是一种用令牌登录的实现方式,类似的还有很多,虽然实现了分布式的登录处理,但是由于不同的系统之间的不同实现,导致开发量剧增。
三,Json web标记
这里推荐使用jwt, Json web标记(官网链接)。一个典型的jwt看起来如下图:
jwt为一个字符串,字符之间通过“霸主地位;分隔符分为三个子串。注意jwt对象为一个长字串,各字串之间也没有换行符,此处为了演示需要,特意分行并用不同颜色表示了。每一个子串表示了一个功能块,总共有以下三个部分:jwt头,有效载荷和签的名,将它们写成一行如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJpYXQiOjE1OTM5NTU5NDMsInVpZCI6MTAsImV4cCI6MTU5Mzk1NTk3Mywic2NvcGVzIjpbImFkbWluIiwidXNlciJdfQ。VHpxmxKVKpsn2Iytqc_6Z1U1NtiX3EgVki4PmA-J3Pg一般是将它放入HTTP请求的头授权字段中
授权:,不记名这里可以打开nuget: https://www.nuget.org/packages/JWT.Standard/,或者在大战中使用
输入jwt.standard找到nuget包下载
1。生成jwt数据
在需要使用的地方输入如c#下代码:
var jwtp =, new JWTPackage(new UserModel () {=,Id “1“,=,Name “yswenli",=,Role “Admin" 180年,},,_pwd); var keyValuePair =, jwtp.GetAuthorizationBearer (); context.HttpContext.Response.Headers [keyValuePair.Key],=, keyValuePair.Value; 怎么在c#中利用jwt实现一个分布式登录功能