我正在使用.net6的aspcore服务来测试jwt的功能。
我发现我授权时的Claims在这里都是用uri表示的,这是为什么呢?虽然字符串可以自定义,但为什么默认提供的类型是uri呢?
{
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "2",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "ssq",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": "[email protected]",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/version": "1",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "admin",
"exp": 1652891588,
"iss": "Issuer",
"aud": "Audience"
}
字符串
经过解析,我发现得到的密钥都是URI,访问这些URI显示的内容是一样的。
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
型
为什么会这样?为什么要用uri来表示它?这会不会使生成的jwt字符变得很长?
我还搜索了一些信息,并阅读了RFC 7519 rfc-editor.org/rfc/rfc7519.html(JSON Web Token(JWT))。在这个标准中有一个关于声明名称的部分。“所有的名称都很短,因为JWT的核心目标是使表示紧凑。
非常困惑,为什么微软这样做?有人知道为什么吗?非常感谢!
1条答案
按热度按时间hgqdbh6s1#
为什么?
正如在评论中已经提到的,它们是URI,旨在提供足够的唯一性,以避免与其他可能的声明提供者发生意外冲突。
超长声明类型通常与一些标准相关,这些标准旨在实现唯一性和冗长性而不是简洁性。我希望常用的声明类型更优先考虑紧凑性,但现在改变已经太晚了。
标准的,虽然使用http方案的一些深不可测的原因,通常不是URL,也没有资源背后的链接。
是否应该使用长标准声明类型?
对于您自己定义的声明类型,通常不需要。但是一定要包含一个简单的名称空间,以提供唯一性,防止意外的第三方声明跳进来。一个好的做法是包含公司/产品,就像
Fabrikam.CRM.MyId
一样。当你已经得到了这些较长的索赔类型,那么保留是有益的,主要原因如下:
**“It just works”.**因为它们是基于标准的,所以它们通常与其他工具配合得很好。即
ClaimsIdentity.Name
默认从http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
查找名称。当然,这可以改变,但如果您使用标准声明,你不需要,事情“只是工作”.或者当你从一些身份提供者那里拉入声明时,那么很可能这就是你得到的。将声明传递给外部如果您将声明传递给第三方,那么通常他们会再次期待标准声明,并且如果您需要在边界处进行声明Map,则事情会更加复杂,并且可能会更容易破裂。或者他们会以某种无法理解的方式向您呕吐。
声明类型长度通常不是问题。优化未破坏的东西通常是有害的。对于大多数应用程序,声明类型长度的影响可以忽略不计。
熟悉度作为标准,它们具有明确的含义,并且通常被遇到它们的任何人很好地理解。对于像
1699346757
这样的值的nbf
声明(提示:JWT nbf)来说,这并不是说。声明Map
如果你不太在意上面的原因,那么你总是可以将传入的声明类型Map到你自己的更短的类型。
如果使用ASP.NET核心,那么IClaimsTransformation可能对您有帮助。