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

时间:2018-06-01 15:03:05

标签: asp.net-core xamarin.ios jwt openid-connect okta

背景

我从Okta那里学到了这个教程: https://developer.okta.com/quickstart/#/ios/dotnet/aspnetcore

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

创建了一个简单的asp.net核心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

此处只列出了一个密钥,其kid 与代码标头中的密钥不匹配

问题:

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

真的希望来自Okta技术团队的人能够权衡并阐明这一点,因为在问题开始时链接的引导式演练不起作用。

谢谢,

梅德

1 个答案:

答案 0 :(得分:3)

问题原来是一个配置问题。

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

这引起了混淆,因为它没有在https://dev-111111.oktapreview.com发现openid-connect配置,而是成功了。它成功的原因是因为Okta支持人员告诉我,它指向Okta API的授权服务器,并且为了安全起见,他们保留用于API令牌的公共签名密钥。这也是签名密钥不同的原因,因为我基本上指向客户端和后端上的2个不同的授权服务器。

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

另一件事是,Ok​​ta有两种不同的产品,一种基于IT的产品,用于管理身份验证和一种developer中心产品。如果您拥有IT版本(管理网站上的深蓝色标题),则除非您购买名为API Access Management的附加服务,否则developer为中心的产品无法使用此功能默认情况下,您的帐户可以使用。

希望这有助于将来的某些人,感谢Okta支持团队为我澄清这一点。