2013-02-28 65 views
6

我正在尝试编写一个移动应用程序,它将从基于Webapi的休息站点获取数据。与JWT的安全WebAPI

该网站应通过ACS进行保护(因为可能有多个身份提供商)。

我的手机应用程序当前正在查询以下网址https://xx.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://xx.azurewebsites.net/&version=1.0以获取IP列表。

然后,我允许用户选择一个IP,然后使用网络浏览器控件向他们显示登录信息。

一旦用户登录,我捕获响应并提取令牌,但现在我不确定我应该做什么。令牌是这样的: -

{"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头的GET请求的一部分?

问题1是我应该如何附加令牌 - 我是否只附加安全令牌位,还是必须对base 64进行编码并再次将其作为Authorization头附加?

问题2如何配置webapi来处理智威汤逊?之后,我已经修改了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. 

感谢

罗斯

回答

8

虽然你不是活得t使用Azure身份验证库this AAL code sample is helpful显示如何使用新的JWT Token Handler在请求管道中使用HTTP消息处理程序验证对Web API的请求。代码显式处理ACS发布的JWT。请特别注意Global.asax.cs中的TokenValidationHandler班。流程如下所示:

  1. 来自客户端应用程序的传入请求通过消息处理程序进行检查。
  2. 使用JWTTokenHandler检查和验证授权标头。
  3. 如果JWT令牌有效,那么JWTTokenHandler将实例化一个新的ClaimsPrincipal对象。如果令牌无效,则返回HTTP 401 Unauthorized响应。

回到你的第一个问题,你只需要"securityToken"值(类似eyJ0eXAiOiJK...)作出授权头像Authorization: Bearer eyJ0eXAiOiJK...。当这个请求传递给您的Web API时,JWTTokenHandler将通过Message Handler来验证它。当然,这假设您的Web API已经正确配置,以便知道您首先从ACS获取令牌的ACS租户和安全域。

编辑:看一下模式&有关保护REST服务并从移动应用程序访问它们的实践指南 - 非常类似的情况,可能有助于为您提供更多的上下文。