我有这个代码来创建一个“
RequestSecurityToken
”:
var request = new RequestSecurityToken
{
TokenType = "some:urn",
AppliesTo = new EndpointReference($"some:other:urn"),
Issuer = new EndpointReference("https://some.domain.net"),
RequestType = RequestTypes.Issue
};
我发现生成的xml有“Issuer”标签,如下所示:
<trust:Issuer>
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>https://some.domain.net/</wsa:Address>
</wsa:EndpointReference>
</trust:Issuer>
问题在于 SecurityTokenService 期望“Issuer”标签仅包含“wsa:Address”标签(没有“EndpointReference”换行):
<trust:Issuer>
<wsa:Address xmlns:wsa="http://www.w3.org/2005/08/addressing">
https://some.domain.net/
</wsa:Address>
</trust:Issuer>
我已经有了“
IClientMessageInspector
”的实现,可以在发送请求消息之前添加一些标头,但我不想也更改其中的请求正文。
我还尝试覆盖自定义类中的 Issuer 属性,但它无法正确序列化消息。
还有其他方法可以解决此问题(除了在发送之前更改 xml 之外)吗?
应用程序使用
.NET Framework 4.8
您可以尝试重写WSTrust13RequestSerializer。
想法是检查元素名称是否为 EndpointReference,如果是,则将其替换为 wsa:Address 元素。
public class CustomRequest : WSTrust13RequestSerializer
{
public override void WriteXml(XmlWriter writer, string elementName, object elementValue, RequestSecurityToken rst, WSTrustSerializationContext context)
{
if (elementName == "EndpointReference")
{
string address = ((EndpointReference)elementValue).Address.Uri.AbsoluteUri;
writer.WriteStartElement("wsa", "Address", "http://www.w3.org/2005/08/addressing");
writer.WriteString(address);
writer.WriteEndElement();
}
else
{
base.WriteXml(writer, elementName, elementValue, rst, context);
}
}
}