0

我有一个 azure ACS 服务,它信任 IP-STS。
对于活动场景,我首先使用用户名、密码凭据从我的 IP-STS 获取 JWT 令牌。有 Oauth2 端点,一切正常。是否可以将此 IP-STS 令牌“交换”为我的 azure ACS 颁发的 JWT 令牌?如果是这样,是否有执行此操作的代码示例。(更糟糕的是,我所有的代码都在 JavaScript 中(实际上是 TypeScript),但这并不重要)。

更新:我正在使用 ACS OAuth2 草案 13 端点处理您的提示。
我进行如下操作:我要求我的自定义 STS(ThinkTecture STS)给我一个用于“ACS OAuth2 Draft 13 endpoint”领域的 JWT 令牌。这需要 TT STS 中全局的 oAuth 客户端 ID 和机密,我认为它们无关紧要。在 TT STS 管理中,我为此领域配置了一个对称密钥:key1。我收到了 3 部分的 JWT 令牌。令牌上的签名确实是用 key1 进行的。然后,我将这个令牌传递给 ACS,其中客户端 ID 和密钥来自指定的服务标识和参数

var form = new FormUrlEncodedContent(new Dictionary<string, string>
{
  { "grant_type", "http://oauth.net/grant_type/jwt/1.0/bearer" },
  { "assertion", rawtoken (the header dot body dot signature form TT STS },
  { "scope", "http://localhost"}
});

不幸的是,我现在得到 {"error":"invalid_client","error_description":"ACS50027: JWT token is invalid. \r\nTrace ID: b107cda5-393b-4b50-b14a-ebaa0ac41913\r\nTimestamp: 2012-12-05 08:58:10Z"}

我了解 JWT 处于测试阶段,因此 ACS50027 尚未记录。困难的部分是没有已知的调试方法。谢谢你的帮助。

4

3 回答 3

2

这绝对是可能的,但我认为现有的任何 ACS 样本都没有这样做,所以你有点处于未知领域。

我推荐的方法是使用 ACS OAuth2 草案 13 端点(如在此示例中,但 JWT 代替 SAML 和 IdP 代替服务身份)。该请求将类似于:

grant_type=http://oauth.net/grant_type/jwt/1.0/bearer&assertion=(JWT)&scope=(RP 领域)。

您需要 JWT 的颁发者来匹配您注册的身份提供者,以及关联的签名密钥,以及通过或更改任何必要声明的规则,并且 RP 具有 JWT 的令牌类型。

于 2012-12-03T22:54:59.780 回答
0

Ok, I finally found a way to do this. Your hint was crucial for the success. The (very) tricky part is that the IP-STS uses a symmetric key to sign the JWT token. I had to programmatically (using the odata api) insert this key in the ACS backoffice under the Identity provider. (the managament console does not show this key anywhere) Everything is nearly fine. The only trouble is that the ACS copies the audience ("aud") from the original token, while I request a token for a different audience ("scope"). Any ideas there ?

于 2013-02-28T08:51:10.387 回答
-1

不,您不能在 ACS 中交换令牌。这样做的唯一可能可行的方法是,如果您能够在 ACS 中将您的 IP-STS 注册为 IdP(如果您的 IP-STS 支持 WS-TRUST 协议,您将能够这样做)。这会让你陷入被动局面。

唯一可能的活动方案方法是使用带有Service Identities的用户名/密码身份验证直接从 ACS 获取 JWT 令牌。在 ACS 中管理服务标识不像管理 ASP.NET Membership 提供程序,但它有一个管理 API

使用服务标识进行身份验证的可能方法是密码、对称密钥、X.509 证书。因此,如果您对原始 IP-STS 进行了足够多的扭曲,以便在其 JWT 令牌中为您提供一个对称密钥作为声明,您将能够使用使用该对称密钥进行身份验证的服务身份从 ACS 获取 JWT 令牌。

但是,如果您已经拥有一个 JWT 令牌,为什么还需要另一个来自 ACS 的令牌?

更新

好吧,声明转换是“被动”模式下的唯一选项。对于活动模式,唯一的方法(我知道)是使用服务标识,因此没有声明转换。

Passive 的问题在于,出于安全原因,ACS 将创建一个隐藏的 POST 表单以将转换后的令牌 POST 提交到您的依赖方应用程序 (RP)。所以没有办法主动获得被动行为。您可以做的只是为了试用,并且由于隐藏形式的被动 POST 而失败:如果您愿意尝试(并且我没有测试并且我完全不知道结果),您可以尝试模拟wsignin1.0提供原始 JWT 令牌的操作。您可以查看WS-Federation Passive Requestor Profile的第 3.1 节,了解如何构建登录请求。您还可以使用Fiddler完全跟踪被动场景的事件链。您将尝试重建的一个是wsignin1.0从注册的 IdP 返回到 ACS 的请求。

在某些时候,您将获得结果 HTML,其中包含一个 FORM 元素。该表单将有两个隐藏字段 -wa值为wsignin1.0并且wresult将包含 URL 编码<t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">....这就是您想要的。

如果您成功地从您的 IdP 重新创建了对 ACS 的原始登录请求,那么这将起作用。

于 2012-12-03T06:57:13.967 回答