JSON Web Token - 如何识别用户?

3
基本上,我使用JWT身份验证,在成功登录后返回JWT令牌、过期时间和用户的GUID(应该吗?)。
让我们举个例子:
我有一个需要进行身份验证的特定用户数据的端点。
那么,我应该如何做呢?
假设 user1 生成了他的jwt:“a.b.c” user2 生成了他的jwt:“c.b.a”
我该如何确保用户1不会使用他的JWT来访问用户2的数据?
我曾考虑过(如我之前提到的)发送用户的GUID与JWT令牌并将其用作标识该用户的方式,但如果某人拥有其他人的GUID,则他将能够操纵他的数据,这是不好的。
提前谢谢。

你好,我看到你是新来的。因此欢迎来到 Stack Overflow。请参加这个导览,了解这个社区支持的问题性质。至于你提出的问题,它看起来过于宽泛。试着写点代码,然后发布它。也许我们可以帮忙。 - Romeo Sierra
这就是JWT的本质。如果有人设法劫持了你的JWT,那么他们基本上可以冒充你。不过,有一些事情可以帮助你消除这种风险,比如使用安全连接以防止被拦截,不要使用寿命非常长的JWT。 - Scott Bamforth
2
我该如何确保用户1不会使用他的JWT来访问用户2的数据?JWT负载通常具有“sub”声明,该声明是令牌颁发给谁的标识符。将“userid”存储在其中,然后检查这两个标识符。然后,JWT令牌所有者只能访问其自己匹配的userid数据。 - Mardoxx
如果用户1能够获取他的JWT令牌,他也可以冒充用户1。因此,通常客户端和服务器之间的通信必须加密,以便数据只能被预期的用户读取。因此,在这种情况下,不应将用户2的JWT发送给用户1,并且在发送令牌时通信渠道必须加密。这是一篇关于OAuth2.0工作流程的好文章: https://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html - Pharaoh
补充Mardoxx的观点,如果一个令牌被签名,你可以读取令牌的内容,但是没有私钥你无法更改它 - 签名防止篡改。 - Mark G
2个回答

0
如果用户1和用户2使用不同的IP发送请求,则可以通过连接用户名和客户端IP生成JWT令牌,并在验证令牌时检查请求是否来自验证请求的用户名+IP和解密令牌中的用户名+IP,否则使用数据过滤机制。

0

它回答了我的问题:

@Mardoxx

如何确保user1不会使用他的JWT访问用户2的数据?jwt负载通常具有子声明,该声明是令牌颁发给谁的标识符。在其中存储userid,然后检查这两个。然后jwt令牌所有者只能访问其自己匹配的userid数据。

并且

如果user1和user2通过分离的IP发送请求,则可以通过连接用户名和客户端IP生成jwt令牌,并在验证令牌时检查请求是否从验证请求用户名+ IP和解密令牌的用户名+ IP发送,否则使用数据过滤机制。

https://dev59.com/cVcO5IYBdhLWcg3wvEGK#45315377

你应该能够在你的控制器中检索到这样的声明。
var identity = HttpContext.User.Identity as ClaimsIdentity;
if (identity != null)
{
    IEnumerable<Claim> claims = identity.Claims; 
    // or
    identity.FindFirst("ClaimName").Value;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接