背景
我从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技术团队的人能够权衡并阐明这一点,因为在问题开始时链接的引导式演练不起作用。
谢谢,
梅德
答案 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之间差异的明确文档我认为它会更少混淆。
另一件事是,Okta有两种不同的产品,一种基于IT
的产品,用于管理身份验证和一种developer
中心产品。如果您拥有IT
版本(管理网站上的深蓝色标题),则除非您购买名为API Access Management
的附加服务,否则developer
为中心的产品无法使用此功能默认情况下,您的帐户可以使用。
希望这有助于将来的某些人,感谢Okta支持团队为我澄清这一点。