stevenjin 2023-11-01 11:27 采纳率: 98.2%
浏览 8
已结题

JWT只能登陆一台设备,否则剔除

一 JWT实现只许一个帐号登陆一台设备的方案,在另一台设备登陆立即剔出,要重新登陆

1 目前通过在Claims中添加最后更新日期方式实现,页面不断轮询该日期是不是缓存中的日期,不是就踢出
2 觉得轮轮询耗费资源,希望优化
3 由于缓存日期在踢出时做了更新,虽然用户引导去了登陆界面,但仍可通过输入地址进行访问,有bug
三.开发环境是c#,NET CORE MVC

  • 写回答

2条回答 默认 最新

  • m0_62946064 2023-11-01 12:33
    关注

    这是一个关于JWT(JSON Web Token)在多设备登录的问题。在你的场景中,你希望实现一个功能,即一个账号只能在一个设备上登录,如果在其他设备登录,那么之前的设备会被踢出。下面我会给出一些建议和解决方案。

    1. 使用JWT实现一个帐号只能在一个设备上登录

    在JWT中,你可以存储用户的设备信息,例如设备ID或者IP地址。当用户尝试在新的设备上登录时,你可以检查JWT中的设备信息是否与当前设备相符。如果不同,那么可以认定用户在其他设备上登录,然后使旧设备的登录状态失效。

    1. 优化轮询方式

    轮询确实是一种资源消耗的方式,一种更好的方式是使用WebSocket或者Server-Sent Events(SSE)。这两种方式都可以实现服务器向客户端推送信息,当用户在新的设备上登录时,服务器可以通过WebSocket或SSE向旧的设备发送一个消息,使其登录状态失效。

    1. 解决用户被踢出后仍可以通过输入地址进行访问的问题

    在用户被踢出后,除了更新缓存日期,你还需要清除用户的登录状态,例如在服务器端删除用户的JWT。同时,你可以在用户尝试访问受保护的资源时检查其登录状态,如果其登录状态无效(例如JWT不存在或者已过期),那么重定向到登录页面。

    在C#, .NET CORE MVC的开发环境中,你可以使用Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authorization这两个库来实现上述功能。具体实现可能会涉及到中间件(Middleware)的使用,以及对于JWT的创建、验证和管理。

    请注意,虽然这种方式能够增强安全性,但它也可能对用户体验产生影响,因为用户可能在不知情的情况下被踢出。因此,在实际应用中,你可能需要给用户一些提示,例如当用户在其他设备上登录时,通知他们并选择是否踢出旧设备。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 创建了问题 11月1日

悬赏问题

  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统
  • ¥188 需要修改一个工具,懂得汇编的人来。