我正在try 使用第三方web服务

我已经将其添加为服务引用,但我不确定如何传递头的凭据.

如何使标头请求与此格式匹配?

<soapenv:Header>
    <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken wsu:Id="UsernameToken-49" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>12345/userID</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/ oasis-200401-wss-username-token-profile-1.0#PasswordText">password123</wsse:Password>
            <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">d+VxCZX1cH/ieMkKEr/ofA==</wsse:Nonce>
            <wsu:Created>2012-08-04T20:25:04.038Z</wsu:Created>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

推荐答案

可能有一种更聪明的方法,但您可以像下面这样手动添加标题:

var client = new IdentityProofingService.IdentityProofingWSClient();

using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(
        new SecurityHeader("UsernameToken-49", "12345/userID", "password123"));
    client.invokeIdentityService(new IdentityProofingRequest());
}

这里,SecurityHeader是一个自定义实现的类,它需要一些其他类,因为我 Select 使用属性来配置XML序列化:

public class SecurityHeader : MessageHeader
{
    private readonly UsernameToken _usernameToken;

    public SecurityHeader(string id, string username, string password)
    {
        _usernameToken = new UsernameToken(id, username, password);
    }

    public override string Name
    {
        get { return "Security"; }
    }

    public override string Namespace
    {
        get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
    }

    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(UsernameToken));
        serializer.Serialize(writer, _usernameToken);
    }
}


[XmlRoot(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class UsernameToken
{
    public UsernameToken()
    {
    }

    public UsernameToken(string id, string username, string password)
    {
        Id = id;
        Username = username;
        Password = new Password() {Value = password};
    }

    [XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
    public string Id { get; set; }

    [XmlElement]
    public string Username { get; set; }

    [XmlElement]
    public Password Password { get; set; }
}

public class Password
{
    public Password()
    {
        Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
    }

    [XmlAttribute]
    public string Type { get; set; }

    [XmlText]
    public string Value { get; set; }
}

我没有在UsernameTokenXML中添加Nonce位,但它与Password位非常相似.Created元素还需要添加,但它是一个简单的[XmlElement].

Asp.net相关问答推荐

Razor 页面客户端站点验证不起作用

分层架构中的 ASP.NET 和实体框架 - 仅将实体框架用于 ORM

asp.net:与其中的用户控件相比,控件/页面的页面生命周期顺序是什么?

下载功能在 asp.net 的更新面板中不起作用

解析 JSON 响应的最简单方法

ASP.net 页面在导入语句上出现错误,但我确实有参考?

如何在asp.net中判断会话是否过期

正在检索组件的 COM 类工厂......错误:80070005 访问被拒绝. (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

使用 JSON.NET 解析 json 字符串

ASP.NET URL 重写

如何在asp.net mvc的html.actionlink中调用javascript函数?

使用 JObject 所需的库名称是什么?

以编程方式从后面的代码中关闭 aspx 页面

ASP.NET MVC Url Route 支持(点)

会话存储在客户端还是服务器端

哪个控件导致了回发?

使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?

ASP.net 判断页面是 http 还是 https

IE9 JavaScript 错误:SCRIPT5007:无法获取属性ui的值:对象为空或未定义

在 ASP.NET 中写入文件以响应后回发不起作用