我正在尝试编写一个移动应用程序来从基于webapi rest的网站获取数据。
该网站应通过ACS保护(因为可能有多个身份提供商)。
我的移动应用目前正在查询以下网址https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0以获取IP列表。
然后我允许用户选择一个IP,然后使用Web浏览器控件向我们显示登录信息。
一旦用户登录,我捕获响应并提取令牌,但现在我不确定我应该做什么。令牌如下所示: -
{"appliesTo":"http://****.azurewebsites.net/",
"context":null,
"created":1362069383,
"expires":1362072983,
"securityToken":"... a lot of text:-)",
"tokenType":"urn:ietf:params:oauth:token-type:jwt"}
所以,我猜测我应该采取securityToken部分并将其添加到获取请求的部分Authorization标头中?
问题1是我应该如何附加令牌 - 我是否只附加了安全令牌位,或者我是否需要对该批次进行64位编码并再次将其作为授权标头附加?
问题2如何配置webapi来处理JWT?在我修改了ACS以发出JWT令牌并且我安装了JWTSecurityTokenHandler后,我仍然收到以下错误(这是使用被动身份验证):
JWT10310: Unable to validate signature. validationParameters.SigningTokenResolver type: 'System.IdentityModel.Tokens.IssuerTokenResolver', was unable to resolve key to a token.
The SecurityKeyIdentifier is:
'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 1,
Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x2FEE3EE96B019D4BA0C046124B77C652EEF768E5)
)
'. validationParameters.SigningToken was null.
由于
罗斯
答案 0 :(得分:8)
虽然您没有使用Azure身份验证库this AAL code sample is helpful来展示如何使用新的JWT Token Handler在请求管道中使用HTTP消息处理程序对Web API的请求进行身份验证。该代码显式处理ACS发布的JWT。请特别注意TokenValidationHandler
中的Global.asax.cs
类。流程如下:
回到第一个问题,您只需要"securityToken"
值(类似eyJ0eXAiOiJK...
)来制作像Authorization: Bearer eyJ0eXAiOiJK...
这样的授权标头。当在Web API的请求中传递此消息时,JWTTokenHandler将通过消息处理程序对其进行验证。当然,这假设您的Web API已经正确配置,以便了解您首先从ACS获取令牌的ACS租户和安全域。
编辑:看一下模式&实施有关保护REST服务并从移动应用程序访问它们的指导 - 非常类似的场景可能有助于为您提供更多背景信息。