如何在c#中创建身份验证Web服务soap

时间:2015-02-04 12:28:31

标签: c# web-services wcf authentication soap

为了连接到soap web服务,我打算对我的客户进行身份验证,但我找不到任何相关信息。在我看来,基于主体的唯一方法可以是Soapheader。 根据我读到的解释,我编写了如下代码:

IService.cs
public interface IService
{
    [OperationContract]
    bool DoWork();
}

Service.cs
public class Service : IService
{
    public AuthHeader Authentication;


    [SoapHeader("Authentication", Required = true)]
    [WebMethod(Description = "Returns some sample data")]
    public bool DoWork()
    {
        if (Authentication.Username == "userName" &&
        Authentication.Password == "pwd")
        {
            //Do your thing
            return true;

        }
        else
        {
            //if authentication fails
            return false;
        }
    }
}

主要问题是当我启动项目时,方法的Header部分中没有参数。

<s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:header>
    <action s:mustunderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/DoWork</action>
</s:header>
<s:body>
    <dowork xmlns="http://tempuri.org/" />
</s:body>
</s:envelope>

请您告诉我如何从客户端获取网络服务的用户名和密码? 如果您有其他方式,请告诉我。 我非常感谢你的合作。

1 个答案:

答案 0 :(得分:-1)

我首先要包括WCFExtras(https://wcfextras.codeplex.com/)。

然后您可以执行以下操作:

1。定义AuthHeader-Class

[DataContract]
public class AuthHeader
{
    [DataMember]
    public string Username { get; set; }

    [DataMember]
    public string Password { get; set; }
}

2。在IService中:将[SoapHeaders]添加到[ServiceContract]中(包含WCFExtras后可以使用SoapHeaders)。同时将[SoapHeader ...]添加到[OperationContract]

[ServiceContract]    
[SoapHeaders]
public interface IService
{
    [OperationContract]
    [WCFExtras.Soap.SoapHeader("AuthHeader", typeof(AuthHeader))]
    bool DoWork();
}

3。在Service.cs中使用SoapHeaderHelper(WCFExtras的一部分):

public class Service : IService
{
    [WebMethod(Description = "Returns some sample data")]
    public bool DoWork()
    {
        AuthHeader authentication = SoapHeaderHelper<AuthHeader>.GetInputHeader("AuthHeader");
        if (@"userName".Equals(authentication.Username) && @"pwd".Equals(authentication.Password))
        {
            //Do your thing
            return true;

        }
        else
        {
            //if authentication fails
            return false;
        }
    }
}