Security 将IP-STS JWT令牌交换为ACS JWT令牌

Security 将IP-STS JWT令牌交换为ACS JWT令牌,security,azure,wif,acs,jwt,Security,Azure,Wif,Acs,Jwt,我有一个azure ACS服务,它信任IP-STS。 对于活动场景,我首先使用用户名、密码凭据从IP-STS获取JWT令牌。有Oauth2端点,一切都很好。 是否可以将此IP-STS令牌“交换”为my azure ACS发行的JWT令牌?如果是这样,是否有这样的代码示例。(更糟糕的是,我所有的代码都是JavaScript(实际上是TypeScript),但这并不重要) 更新: 我正在使用ACS OAuth2草案13端点处理您的提示。 我按照以下步骤进行:我要求我的定制STS(Thinktectu

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

更新: 我正在使用ACS OAuth2草案13端点处理您的提示。
我按照以下步骤进行:我要求我的定制STS(ThinktectureTS)为“ACS OAuth2 draft 13 endpoint”领域提供一个JWT令牌。这需要oAuth客户机id和secret,它们在TT STS中是全局的,我认为它们是无关的。在TT STS管理中,我为这个领域配置了一个对称密钥:key1。我收到由三部分组成的JWT代币。令牌上的签名确实是使用密钥1进行的。 然后,我使用客户机id和来自服务标识和指定参数的机密将此令牌传递给ACS

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"}
});
var form=new FormUrlEncodedContent(新字典
{
{“授权类型”http://oauth.net/grant_type/jwt/1.0/bearer" },
{“断言”,rawtoken(头点体点签名形式TT STS},
{“范围”http://localhost"}
});
不幸的是,我现在明白了 {“错误”:“无效的客户端”,“错误描述”:“ACS50027:JWT令牌无效。\r\n空间ID:b107cda5-393b-4b50-b14a-ebaa0ac41913\r\n时间戳:2012-12-05 08:58:10Z”}

我知道JWT是测试版,因此ACS50027还没有文档记录。困难的是没有已知的调试方法。感谢您的帮助。

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

唯一可能的活动场景方法是使用用户名/密码身份验证直接从ACS获取JWT令牌。在ACS中管理好服务身份与管理ASP.NET成员资格提供程序不同,但它有一个简单的方法

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

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

更新

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

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

在某个时刻,您将得到结果HTML,其中包含一个表单元素。该表单将有两个隐藏字段-
wa
,其值为
wsignn1.0
wresult
,其中将包含URL编码的
,这就是您想要的


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

这肯定是可能的,但我认为现有的ACS示例中没有任何一个可以这样做,因此您的领域有点未知

我建议的方法是使用ACS OAuth2 draft 13端点(如中所示,但JWT代替SAML,IdP代替服务标识)

grant_类型=http://oauth.net/grant_type/jwt/1.0/bearer&assertion=(JWT)&范围=(RP领域)


您需要JWT的颁发者与您注册的身份提供商匹配,以及相关的签名密钥,加上必要时传递或更改任何声明的规则,以及RP具有JWT令牌类型的规则。

好的,我终于找到了一种方法。您的提示对成功至关重要棘手的是IP-STS使用对称密钥对JWT令牌进行签名。我必须通过编程(使用odata api)将此密钥插入身份提供程序下的ACS后台。(managament控制台没有在任何地方显示此密钥)一切都很好。唯一的问题是ACS复制了观众(“aud”)从原始令牌,而我为不同的受众请求令牌(“范围”)。有什么想法吗?

我的STS在ACS中注册为身份提供商。我不想使用服务身份。我想拥有真实的身份。但是,如果您已经拥有JWT令牌,为什么需要ACS提供另一个令牌?原因有二:我不打算将每个ip作为颁发者添加到每个客户端。第二:我想使用ACS来确保cl我从任何IP获得的目标都是“相似的”,换句话说,我需要声明转换。这两个原因解释了我试图实现的目标。具体来说,GetOauth2ResponseFromAcs()链接示例中的函数应该会对您有所帮助。好的,谢谢,我一定会尝试。关于这类事情的文档非常缺乏。我目前正在调查进行交换。我认为您的方法通常会更简单。您可以使用WS-Trus