Asp.net web api 使用带有委托的JWT令牌(ActAs)

Asp.net web api 使用带有委托的JWT令牌(ActAs),asp.net-web-api,wif,claims-based-identity,jwt,Asp.net Web Api,Wif,Claims Based Identity,Jwt,我有一个使用WIF和.NET4.5实现的基于声明的身份验证系统的工作实现。它包含以下常见部分: 具有被动和主动端点的自定义STS 后端WCF服务 前端MVC应用程序 前端WebApi应用程序 从前端应用程序到backedn WCF服务的调用使用委托身份验证,因此用户在前端应用程序中进行身份验证,应用程序请求一个新的令牌,并使用ActAs=BootstrapToken,然后调用WCF服务 这一切都可以正确使用SAML令牌 现在我想使用JWT令牌与WebApi对话,所以我在我的STS和WebAp

我有一个使用WIF和.NET4.5实现的基于声明的身份验证系统的工作实现。它包含以下常见部分:

  • 具有被动和主动端点的自定义STS
  • 后端WCF服务
  • 前端MVC应用程序
  • 前端WebApi应用程序
从前端应用程序到backedn WCF服务的调用使用委托身份验证,因此用户在前端应用程序中进行身份验证,应用程序请求一个新的令牌,并使用ActAs=BootstrapToken,然后调用WCF服务

这一切都可以正确使用SAML令牌

现在我想使用JWT令牌与WebApi对话,所以我在我的STS和WebApi项目中安装了Nuget包

因此,我让我的STS正确地发布签名JWT令牌,让我的WebApi依赖方验证相同的令牌。都很好

问题:

如果我在RST的ActAs字段中使用JWT令牌,它将被发送,而没有签名,因此STS自然会拒绝它。似乎SecurityTokenHandler.ReadToken()方法返回的令牌返回一个没有任何签名信息的令牌

现在我的困境是:这是JWT令牌支持的场景吗?据我所知,与SAML令牌不同,JWT令牌并不携带验证签名的所有信息,因此还有其他限制吗

另一方面,如果这一点确实得到支持,是否有人以前实施过这一点,或者有任何想法?这是一个开发人员预览,所以它可能是一个bug吗

编辑

这是一个例子来说明这个问题。代码在STS(具有签名密钥访问权限)和依赖方(具有证书公钥访问权限)中运行时产生相同的结果:

System.Diagnostics.Debug.WriteLine("Raw Token       : {0}", (object)rawToken);

var readToken = this.identityConfiguration.SecurityTokenHandlers.ReadToken(rawToken);

this.identityConfiguration.SecurityTokenHandlers.ValidateToken(readToken);

var serializedToken = this.identityConfiguration.SecurityTokenHandlers.WriteToken(readToken);

System.Diagnostics.Debug.WriteLine("Serialized Token: {0}", (object)serializedToken);
产生以下结果

Raw Token       : eyJAi(...)x3a9.eyJvYXB(...)DYzWiJ9.y-lT(...)PyBUTw
Serialized Token: eyJAi(...)x3a9.eyJvYXB(...)DYzWiJ9.
因此,很明显,读/写往返会丢失签名信息。我可以理解为什么这种情况会发生在RP中,但不会发生在STS中

编辑2

下面是当前的
JWTSecurityTokenHandler.WriteToken(SecurityToken令牌)
实现:

public override string WriteToken(SecurityToken token)
{
    Utility.VerifyNonNullArgument("token", token);
    JWTSecurityToken jWTSecurityToken = token as JWTSecurityToken;
    if (jWTSecurityToken == null)
    {
        throw new SecurityTokenException(string.Format(CultureInfo.InvariantCulture, "JWT10200: This instance of JWTSecurityTokenHandler can only write SecurityTokens of type '{0}', a SecurityToken of type '{1}' was received.", new object[]
        {
            typeof(JWTSecurityToken),
            token.GetType()
        }));
    }
    string text = string.Empty;
    string text2 = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", new object[]
    {
        jWTSecurityToken.EncodedHeader,
        jWTSecurityToken.EncodedPayload
    });
    if (jWTSecurityToken.SigningCredentials != null)
    {
        text = this.Sign(text2, jWTSecurityToken.SigningCredentials);
    }
    return string.Format(CultureInfo.InvariantCulture, "{0}.{1}", new object[]
    {
        text2,
        text
    });
}
通过调查,很明显,在RP中写入的令牌永远不会有签名,因为我们没有签名凭据。因此,这看起来不像是一个bug,而是一个实现决策。我只是不明白为什么


谢谢

如果这是一个bug,我不会感到惊讶-JWT处理程序仍然处于预览模式

但是,也许您不想对Web API服务执行全面的ActAs—请看这里:


查看JWTSecurityToken.RawData。它包含原始的encodedToken。并且应该具有原始发行人的签名。

这既不是安全性(或任何其他)缺陷,也不是实施决策。
写入可以生成带有签名的JWT的唯一位置是发布点。 除了令牌颁发者之外的任何一方都不应该尝试重新创建它(这就是您所说的读写往返)。 当您收到签名的JWT时,您只能对其进行验证和读取。您可以自由地按原样重新传输原始JWT,但您将无法“正确”重建它,因为您不是颁发者,并且没有适当的签名密钥

这正是签署代币的原因:只有原始发行人才能正确签署代币


如果您愿意,我可以尝试使用安全令牌和STS帮助您设计正确的场景,但为此,请共享您正在实施的场景的序列图。

很抱歉,当令牌进入ReadToken时,它是这样的吗“EYJ0EXAIIOIJKV1QILA0KICJHBGCIOIJIUZI1NIJ9.EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODASDQOGIMH0DHA6LY9LEGFT CGXLLMNVBS9PC19YB290IJP0IJP0CNVLFQ.”带尾随空“?还是有第三部分进入ReadToken?STS发布的令牌有三部分。我用于SecurityTokenHandler.ReadToken的输入字符串(字符串)也有3个部分。但是到达STS的令牌到达时没有签名(最后一部分)请参阅我的示例代码编辑。唯一一个位置写入可以生成带有签名的JWT的是发布点。任何其他情况都将是一个安全漏洞。我不确定我是否完全理解您想要实现的目标,但除了令牌颁发者之外的任何一方都不应该尝试重新创建它(这就是您所说的读写往返)。当您收到签名的JWT时,您只能验证和读取它。您可以按原样重新传输原始JWT,但您将无法“正确”“重新构造它,因为您不是颁发者。我看不出这怎么会是一个安全漏洞。您没有生成新签名的私钥,因此无法更改令牌的内容。STS(或任何收件人)具有验证令牌所需的所有信息。如果我错了,请更正我,但当您将SAML令牌附加到RST时,需要写入它(您正在附加一个以前已读取的SecurityToken实例)。在将该令牌附加到RST之前,WIF需要将该令牌写回XML,包括RP没有相应私钥的签名。谢谢,根据您的回答,我认为这应该得到支持,而且JWT与SAML相比没有限制。我已经读过这篇文章(我猜整个博客:),但事实是,我已经有了“富人”代表团,所以这似乎是不必要的降级。但是,是的,这仍然是一个预览,所以预计会出现bug。我将尝试反编译整个程序集,看看我用当前的WriteToken实现编辑了这个问题后能找到什么。你知道吗?谢谢Hanks Brent我以前确实试过使用原始数据。但是对于ActAs属性,我需要一个SecurityTokenElement。要创建一个令牌,我需要一个SecurityToken或一个带有令牌数据的XmlElement。现在我相信,即使使用XmlElement路由,WIF仍然会从中创建和验证令牌,从而丢失签名。我可以