Okta 使用 OpenID Connect 配置中的公钥验证 JWT 令牌

Dmi*_*lov 2 xamarin.ios jwt openid-connect okta asp.net-core

背景

我遵循 Okta 的本教程: https ://developer.okta.com/quickstart/#/ios/dotnet/aspnetcore

实现了 Xamarin 的开源 AppAuth.iOS 组件版本,以便能够在 Xamarin.iOS 项目中使用它。(作品)

创建了一个简单的 asp.net core Web 服务,如上面的文章所示并按照说明进行配置。

问题:

通过移动应用程序成功进行身份验证后,我收到 JWT 访问令牌,并使用此令牌调用测试 Web 服务。Web 服务无法验证令牌,并显示以下错误消息

错误:

Signature validation failed. Unable to match keys: 'HD3v3KXvARUyg_9i26m2i8itsCY7TpA0-ajhcOsBdkM', token: '{"alg":"RS256","typ":"JWT","kid":"HD3v3KXvARUyg_9i26m2i8itsCY7TpA0-ajhcOsBdkM"}.{"ver":1,"jti":"AT.J4uuLmOgCLslqlnUzNbjhw7dzm5KurJVJxHNIXZx-g8.zQJUh4NcHWcIBvdWVLy7fXea4cCoPxv7Avh3+z6PiGM=","iss":"https://dev-111111.oktapreview.com","aud":"https://dev-111111.oktapreview.com","sub":"dsamuylov@111111.com","iat":1527861992,"exp":1527865592,"cid":"0oafa27024puCyvwi0h7","uid":"00uf9rphkt6D8gcXI0h7","scp":["offline_access","openid","profile"]}'. at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()

调试:

使用https://jwt.io/检查 JWT 令牌后,我发现了kid用于签署令牌的签名公钥

然后我转到我帐户的 openid-connect 配置 https://dev-111111.oktapreview.com/oauth2/default/.well-known/openid-configuration

找到密钥网址https://dev-111111.oktapreview.com/oauth2/default/v1/keys

那里只列出了 1 个密钥,并且它kid 与令牌标头中的密钥不匹配

问题:

如果我为移动客户端和 Web 服务使用相同的 Okta 帐户/服务器,为什么会发生这种情况?这个关键的不匹配来自哪里?

真的希望 Okta 技术团队的某人能够参与并阐明这一点,因为问题开头链接的指导演练不起作用。

谢谢你,

德米特里

Dmi*_*lov 5

结果发现问题是配置问题。

在获取令牌的移动客户端中,AppAuth 组件是使用issuer设置 as初始化的https://dev-111111.oktapreview.com,而不是正确的值https://dev-111111.oktapreview.com/oauth2/default

这导致了混乱,因为它并没有未能发现 处的 openid-connect 配置https://dev-111111.oktapreview.com,而是成功了。它成功的原因是因为正如 Okta 支持人员告诉我的那样,它指向 Okta API 的授权服务器,并且出于安全目的,他们隐藏了用于 API 令牌的公共签名密钥。这也是签名密钥不同的原因,因为我本质上是指向客户端和后端上的 2 个不同的授权服务器。

如果这个 url 无法检索 openid-connect 配置,或者如果有一些关于两者之间差异的明确文档,我认为混淆会少得多。

另一件需要意识到的事情是,Okta 有 2 种不同的产品,一种是IT用于管理身份验证的基础产品,另一种是developer中心产品。中心产品IT没有此功能,除非您购买名为 的附加服务API Access Management,如果您有该developer版本(管理网站上的深蓝色标题),则默认情况下您的帐户上可以使用此功能。

希望这对将来的人有所帮助,感谢 Okta 支持团队为我澄清了这一点。