如何自定义RequestSecurityToken Issuer?

问题描述 投票:0回答:1

我有这个代码来创建一个“

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

c# .net wcf wif ws-trust
1个回答
0
投票

您可以尝试重写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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.