JSON Web 令牌 - 如何识别用户?
Posted
技术标签:
【中文标题】JSON Web 令牌 - 如何识别用户?【英文标题】:JSON web token - how to identify user? 【发布时间】:2018-12-27 09:18:58 【问题描述】:基本上,我使用 JWT 身份验证,在成功登录后,我将返回 JWT 令牌、到期时间和用户的 GUID(我应该吗?)
让我们举个例子:
我有一个端点,它返回需要经过身份验证的用户特定数据
那么,我该怎么做呢?
让我们这么说
user1 生成了他的 jwt:“a.b.c”
user2 生成了他的 jwt:“c.b.a”
如何确保 user1 不会使用他的 JWT 访问 user 2 的数据?
我考虑过(正如我之前提到的)使用 JWT 令牌发送用户的 GUID 并将其用作识别该用户的一种方式,但如果有人有其他人的 GUID,那么他将能够操纵他的数据,这不是不错。
提前致谢。
【问题讨论】:
你好,我看到你是新来的。因此欢迎来到 Stack Overflow。请通过this tour 了解该社区支持的问题的性质。至于你问的问题,看起来too-broad。尝试一下,然后发布您的代码。那么也许我们可以帮忙.. 这就是 JWT 的本质。如果有人设法劫持了您的 JWT,那么他们基本上可以假装是您。您可以采取一些措施来帮助消除这种情况,例如使用安全连接以使其不被拦截,并且不使用寿命很长的 JWTHow can I ensure that user1 will not use his JWT to access user's 2 data?
jwt 有效负载通常具有sub
声明,这是令牌颁发给谁的标识符。将userid
存储在其中,然后检查两者。那么 jwt token owner 只能访问自己匹配的 userid 数据。
如果 user1 可以使用 JWT,他也可以伪装成 user1,因此通常您的客户端和服务器之间的通信必须加密,以便数据只能由预期用户读取,因此在这种情况下,不应将 user2 的 JWT 发送给 user1,并且在发送令牌时,必须对通信通道进行加密这是一篇关于 oauth2.0 工作流程的好文章requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html
要添加到 Mardoxx 点,如果令牌已签名,您可以读取令牌的内容,但没有私钥您无法更改它 - 签名可防止篡改。
【参考方案1】:
如果 user1 和 user2 通过单独的 ip 发送请求,您可以通过连接用户名和客户端 ip 来生成 jwt 令牌,并在验证令牌时检查从验证请求发送的请求用户名 + ip 和用户名 + ip 来自解密令牌,否则使用数据过滤机制
【讨论】:
【参考方案2】:它回答了我的问题:
@Mardoxx
如何确保 user1 不会使用他的 JWT 访问 user 2 的数据? jwt 有效负载通常具有 sub 声明,它是令牌颁发给谁的标识符。将用户 ID 存储在其中,然后检查两者。那么 jwt token owner 只能访问自己匹配的 userid 数据。
和
如果 user1 和 user2 通过单独的 ip 发送请求,您可以通过连接用户名和客户端 ip 来生成 jwt 令牌,并在验证令牌时检查从验证请求发送的请求用户名 + ip 和用户名 + ip 来自解密令牌,否则使用数据过滤机制
和
https://***.com/a/45315377/10074551
您应该能够在您的控制器中检索这样的声明
var identity = HttpContext.User.Identity as ClaimsIdentity;
if (identity != null)
IEnumerable<Claim> claims = identity.Claims;
// or
identity.FindFirst("ClaimName").Value;
【讨论】:
以上是关于JSON Web 令牌 - 如何识别用户?的主要内容,如果未能解决你的问题,请参考以下文章