【问题标题】:How to verify and change a JWT Alg如何验证和更改 JWT Alg
【发布时间】:2016-12-16 02:32:18
【问题描述】:

我正在使用 ASP.Net OpenID Connect Server 项目 (ASOS) 为我的 WebAPI 创建和使用 JWT。

我现在正在尝试对令牌执行各种验证。

我想知道如何检查“alg”类型。 我知道可以传入“none”的问题,这意味着有人可以伪造令牌(我不确定是否只是特定的库有问题,或者它是否只是检查的一般好习惯,但如果我执行该检查,我会感觉更安全)。

另外,如何验证 JWT 的完整性?

目前我的令牌发行者和 WebAPI 在同一个项目中,所以我猜它是自动为我检查的?还是根本没有检查?

我的理解是,如果您未指定任何签名凭据,则会在磁盘上为您添加某种签名凭据(不确定我在哪里读到的)。

提供某种签名凭据会自动更新“alg”属性吗?

如果我的令牌颁发者在 1 台服务器上,而我的 WebAPI 在某个完全不同的地方怎么办。我将如何验证令牌来自我的令牌发行者并且没有受到干扰。

大概我必须手动添加证书,然后以某种方式共享公钥? 如果是这种情况,有人可以指出我应该在哪里添加公钥来检查 JWT 完整性吗? 大概这部分更多的是关于 asp.net Core 而不是 OpenIDConnect Server (ASOS)?

谢谢。

【问题讨论】:

    标签: asp.net-web-api oauth oauth-2.0 asp.net-core aspnet-contrib


    【解决方案1】:

    我想知道如何检查“alg”类型。

    您可以使用 jwt.io 之类的工具来读取 JWT 的标头,其中包含您要查找的 alg 值。

    我知道可以传入“none”的问题,这意味着有人可以伪造令牌(我不确定是否只是特定的库有问题,或者这只是一般的好习惯进行检查,但如果我执行该检查,我会感觉更安全)。

    ASOS 依赖 IdentityModel(微软开发的一个框架)来生成 JWT 令牌(您可以查看 this other answer for more information)。 AFAIK,它不受您提到的安全漏洞的影响。

    要自己尝试,您可以使用 jwt.io 更改 alg 标头值并将生成的编码 JWT 发送到您的 API。

    另外,如何验证 JWT 的完整性?

    目前我的令牌发行者和 WebAPI 在同一个项目中,所以我猜它是自动为我检查的?还是根本没有检查?

    如果我的令牌颁发者在 1 台服务器上,而我的 WebAPI 在某个完全不同的地方怎么办。我将如何验证令牌来自我的令牌发行者并且没有受到干扰。

    大概我必须手动添加证书,然后以某种方式共享公钥?如果是这样的话,有人能指出我应该在哪里添加公钥来检查 JWT 完整性吗?想必这部分更多是关于 asp.net Core 而不是 OpenIDConnect Server (ASOS)?

    如果您使用 JWT 承载中间件,它会自动为您完成。为此,它直接下载ASOS' JWK set endpoint 公开的公共签名密钥(默认为/.well-known/jwks)。

    这是一个例子:

    我的理解是,如果您未指定任何签名凭据,则会在磁盘上为您添加某种签名凭据(不确定我在哪里读到的)。

    最新的官方版本(beta6)也是如此,但此功能将在下一个版本中删除。我们鼓励您注册 X.509 证书或使用临时签名密钥(在开发期间)。否则会抛出异常。

    提供某种签名凭据会自动更新“alg”属性吗?

    是的。 ASOS 本身支持对称密钥和 RSA 密钥。例如,如果您在调用options.SigningCredentials.AddKey(...) 时使用SymmetricSecurityKey,则将返回HS256 (HMAC-SHA256) 而不是RS256 (RSA-SHA256)。您可以使用接受SigningCredentials 实例的Add 重载提供其他算法。

    【讨论】:

    • 感谢您的回复。您能否澄清以下几点:-当我说我想检查“alg”类型时,我的意思是编程,我该怎么做? -我刚刚尝试了您提到的众所周知的端点,它显示的内容类似于您的屏幕截图。 --jwtBearer 中间件怎么知道去哪里看呢?如果 WebAPI 位于不同的网络服务器上,我如何将其指向正确的位置?
    • 上一节提到,alg的值直接取决于你注册的SigningCredentials。你可以控制那里的价值。 JWT 不记名中间件知道如何联系授权服务器,因为您在 JWT 选项中分配 Authority 时设置了颁发者地址。
    • 对不起,关于“alg”,我认为我不够具体。我的意思是我想检查传入令牌的“alg”,而不是如何在创建时设置它(对于我有这个特定问题)。感谢您澄清 JWT 不记名中间件授权,这很有意义。
    猜你喜欢
    • 2020-11-27
    • 2021-06-24
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2014-05-29
    • 2019-09-22
    • 2020-10-09
    相关资源
    最近更新 更多