没有JWT的安全Web API

时间:2013-02-28 17:31:08

标签: azure wif azure-acs

我正在尝试编写一个移动应用程序来从基于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.

由于

罗斯

1 个答案:

答案 0 :(得分:8)

虽然您没有使用Azure身份验证库this AAL code sample is helpful来展示如何使用新的JWT Token Handler在请求管道中使用HTTP消息处理程序对Web API的请求进行身份验证。该代码显式处理ACS发布的JWT。请特别注意TokenValidationHandler中的Global.asax.cs类。流程如下:

  1. 来自客户端应用程序的传入请求由消息处理程序检查。
  2. 使用JWTTokenHandler检查并验证授权标头。
  3. 如果JWT令牌有效,JWTTokenHandler将实例化一个新的ClaimsPrincipal对象。如果令牌无效,则返回HTTP 401 Unauthorized响应。
  4. 回到第一个问题,您只需要"securityToken"值(类似eyJ0eXAiOiJK...)来制作像Authorization: Bearer eyJ0eXAiOiJK...这样的授权标头。当在Web API的请求中传递此消息时,JWTTokenHandler将通过消息处理程序对其进行验证。当然,这假设您的Web API已经正确配置,以便了解您首先从ACS获取令牌的ACS租户和安全域。

    编辑:看一下模式&实施有关保护REST服务并从移动应用程序访问它们的指导 - 非常类似的场景可能有助于为您提供更多背景信息。