JWT 单点登陆之有状态登陆与无状态登陆的区别

单点登录与 JWT 1

  JWT 全称: Json Web Token 。
  作用: JWT 的作用是 用户授权(Authorization) ,而不是用户的身份认证(Authentication)
  用户认证 指的是使用用户名、密码来验证当前用户的身份,即用户登录。
  用户授权 指用户登录成功后,当前用户有足够的权限访问特定的资源。

传统的 Session 登录:

  • 用户登录后,服务器会保存登录的 Session 信息
  • Session ID 会通过 cookie 传递给前端
  • http 请求会附带 cookie
    这种登录方式称为 有状态登录

  有状态登录(Session): 传统上,我们会使用 Session 和 Cookie 来保存用户的授权信息。第一步,登录过程,用户使用用户名和密码来登录系统,服务器会来验证用户名和密码是否正确,如果正确,服务器会给这个用户创建一个包含用户登录信息、角色、权限的一个叫做 Session 的东西,然后把这个 Session 保存起来,同时把这个 Session 的 ID 以 Cookie 的形式发送给前端,表示用户验证成功,登录完成了;接下来如果用户希望访问某些资源,前端要向后端发起一个 HTTP 的请求,同时相应的 Cookie 也会跟随请求一起发送给服务器,而服务器取得 Cookie 以后就会去查找是否有 Session ID ,然后通过 Session ID 提取相应的 Session 来确定用户的身份与权限,如果 Session 与 ID 相符,同时用户的信息也能提供相应的权限,服务器就会认为这个用户已经登录了,随后资源信息就会通过 HTTP 响应给前端。
客户端 服务器 POST api/login{email,password} 通过 cookie 传递 session ID 请求携带 cookie ,并包含 sessionID 如果用户认证成功,则返回资源 用户登陆 访问资源 创建并保存 session 通过sessionID 来确定用户 身份与权限 有状态登陆(Session)
  无状态登陆(JWT): 第一步,同样是登陆,用户使用用户名和密码登陆,如果登陆成功,服务器就会返回一个加密文档,这个文档就是 JWT ,其中包含用户密码以外,全部的认证信息,包括用户名、Email、角色、权限等等,而前端在拿到 这个JWT 以后就可以把它保存起来了,可以保存到 Cookie 中,也可以保存到浏览器的 LocaStorage 里面,而生成的 JWT 不需要在后端保存,接下来第二步,用户如果需要访问某些权限的时候,这时候,用户就要把 JWT 放在 HTTP 请求 herder 中与请求一起发送给服务器,服务器取得 JWT 以后 会使用私钥给 JWT 文档解密 ,如果解密成功而且数据依然有效则代表用户已经登陆了,如果 JWT 所描述的用户权限允许该用户访问资源,那么服务器就会把资源的信息,通过 HTTP 响应发回给前端。
客户端 服务器 POST api/login{email,password} 返回 JWT 请求携带 JWT 如果 JWT 有效则返回资源 用户登陆 访问资源 使用密码加密 JWT 使用相同的密码验证JWT 无状态登陆(JWT)
  区别与差异: 传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。

JWT官网: https://jwt.io/


  1. 来源于慕课网的学习总结 ↩︎

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)单点登录是一种基于 token 的验证机制,能够实现多个应用之间的用户认证与授权状态共享,从而实现单点登录。实现 JWT 单点登录的基本流程如下: 1. 用户通过认证中心登录,认证中心颁发一个 JWT Token 给用户。 2. 用户访问其他应用,将 JWT Token 通过请求头或参数方式传递给应用。 3. 应用接收到 JWT Token 后进行验证,验证通过后即可获取用户信息,实现单点登录。 下面是使用 .NET 实现 JWT 单点登录的示例代码: 1. 安装 JWT 库 使用 NuGet 包管理器安装 System.IdentityModel.Tokens.Jwt 库。 2. 创建 JWT Token 在认证中心中创建 JWT Token 并返回给用户。示例代码如下: ```csharp public string GenerateToken(User user) { var secretKey = Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]); var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha256); var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), new Claim(ClaimTypes.Name, user.Name), new Claim(ClaimTypes.Email, user.Email), new Claim("Role", user.Role) }; var tokenOptions = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpirationMinutes"])), signingCredentials: signingCredentials ); return new JwtSecurityTokenHandler().WriteToken(tokenOptions); } ``` 3. 验证 JWT Token 在其他应用中接收 JWT Token 并进行验证。示例代码如下: ```csharp public bool ValidateToken(string token) { var secretKey = Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]); try { new JwtSecurityTokenHandler().ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(secretKey), ValidateIssuer = true, ValidIssuer = _configuration["Jwt:Issuer"], ValidateAudience = true, ValidAudience = _configuration["Jwt:Audience"], ValidateLifetime = true, ClockSkew = TimeSpan.Zero }, out SecurityToken validatedToken); return true; } catch { return false; } } ``` 以上代码仅为示例,实际使用中需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值