gpt4 book ai didi

asp.net-web-api - 使用带委托(delegate)的 JWT token (ActAs)

转载 作者:行者123 更新时间:2023-12-01 11:47:47 24 4
gpt4 key购买 nike

我有一个使用 WIF 和 .NET 4.5 实现的基于声明的身份验证系统的有效实现。它包含通常的部分:

  • 具有被动和主动端点的自定义 STS
  • 后端 WCF 服务
  • 前端 MVC 应用程序
  • 前端 WebApi 应用程序

从前端应用程序到后端 WCF 服务的调用使用委托(delegate)身份验证,因此用户在前端应用程序中进行身份验证,应用程序使用 ActAs=BootstrapToken 请求新 token ,然后调用 WCF 服务。

这一切都与 SAML token 一起正常工作。

现在我想使用 JWT token 与 WebApi 对话,所以我安装了 JSON Web Token Handler For the Microsoft .Net Framework 4.5我的 STS 和 WebApi 项目中的 Nuget 包。

所以我的 STS 正确地发出了签名的 JWT token ,我的 WebApi 依赖方验证了相同的 token 。一切都很好。

问题:

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

现在我的困境是:这是 JWT token 支持的场景吗?据我了解,与 SAML token 相反,JWT token 不包含验证签名的所有信息,因此还有其他限制吗?

另一方面,如果确实支持这一点,那么之前是否有人实现过或有任何想法?这是一个开发者预览版,所以它会是一个错误吗?

编辑

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

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 token) 实现:

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
});
}

通过调查,很明显书面 token 在 RP 中永远不会有其签名,因为我们没有签名凭证。所以这看起来不像是错误,而是一个实现决定。我只是不明白为什么。

谢谢

最佳答案

这既不是安全(或任何其他)错误,也不是实现决策。Write 可以生成带有签名的 JWT 的唯一位置是发布点。 token 发行者以外的任何一方都不应该尝试重新创建它(这就是读写往返的意思)。当您收到签名的 JWT 时,您只能对其进行验证和阅读。您可以按原样自由重新传输原始 JWT,但您将无法“正确”重建它,因为您不是发行者并且没有适当的签名 key 。

这就是签署 token 的真正原因:只有原始发行者才能正确签署。

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

关于asp.net-web-api - 使用带委托(delegate)的 JWT token (ActAs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com