如何验证和更改JWT Alg

时间:2016-08-09 21:49:47

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

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

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

我想知道如何检查“alg”类型。 我知道一个问题,“无”可以传入,这意味着有人可以伪造代币(我不确定它是否只是具有问题的特定库,或者通常是检查的一般做法,但如果我正在进行检查,我会觉得更安全。)

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

目前我的令牌发行人和WebAPI在同一个项目中,所以我猜它会自动检查我吗?或者根本没有检查过?

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

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

如果我的令牌发行者位于1台服务器上,而我的WebAPI完全不同,该怎么办?我如何验证令牌来自我的令牌发行者并且没有受到干扰。

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

感谢。

1 个答案:

答案 0 :(得分:2)

  

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

您可以使用jwt.io之类的工具来阅读JWT的标题,其中包含您正在寻找的alg值。

  

我知道一个问题,“无”可以传入,这意味着有人可以伪造代币(我不确定它是否只是具有问题的特定库,或者它是否只是一般的好习惯检查,但如果我进行检查,我会觉得更安全。)

ASOS依赖于IdentityModel--一个由Microsoft开发的框架 - 来生成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)。

以下是一个例子:

JWK Set

  

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

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

  

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

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