WebService标头身份验证

时间:2013-08-06 20:05:37

标签: c# .net web-services authentication soapheader

现在,我得到了我的webservice身份验证,但我已经在WebMethod中调用了一个方法,如下所示:

[WebMethod]
[SoapHeader("LoginSoapHeader")]
public int findNumberByCPF(string cpf)
        {
            try
            {
                LoginAuthentication();
                var retRamal = DadosSmp_Manager.RetornaRamalPorCPF(cpf);
                var searchContent= String.Format("CPF[{0}]", cpf);
                DadosSmp_Manager.insertCallHistory(retRamal, searchContent);

                return retRamal.Ramal;
            }
            catch (Exception ex)
            {
                Log.InsertQueueLog(Log.LogType.Error, ex);
                throw getException(ex.TargetSite.Name, cpf);
            }
        }

我现在想要在不调用“LoginAuthentication()”方法的情况下对此WebMethod进行身份验证,只使用SOAP Header - SoapHeader(“LoginSoapHeader”) - 位于代码内部。

然后,我的问题是如何仅使用标题来验证我的WebMethod?

提前致谢。

1 个答案:

答案 0 :(得分:14)

要求是Web服务客户端在访问Web方法时必须提供用户名和密码。

我们将使用自定义soap标头而非http标头

来实现此目的

.NET框架允许您通过从SoapHeader类派生来创建自定义SOAP标头,因此我们想要添加用户名和密码

using System.Web.Services.Protocols;

public class AuthHeader : SoapHeader
{
 public string Username;
 public string Password;
}

要强制使用我们的新SOAP标头,我们必须将以下属性添加到方法

[SoapHeader ("Authentication", Required=true)]

在.cs

中包含班级名称
public AuthHeader Authentication;


[SoapHeader ("Authentication", Required=true)]
[WebMethod (Description="WebMethod authentication testing")]
public string SensitiveData()
{

//Do our authentication
//this can be via a database or whatever
if(Authentication.Username == "userName" && 
            Authentication.Password == "pwd")
{
   //Do your thing
   return "";

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

我们使用SOAP请求中的soap:Header元素进行身份验证,不要误解随请求发送的HTTP头。 SOAP请求类似于:

 <?xml version="1.0" encoding="utf-8"?>
 <soap:Envelope  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Header>
   <AUTHHEADER xmlns="http://tempuri.org/">
     <USERNAME>string</USERNAME>
     <PASSWORD>string</PASSWORD>
   </AUTHHEADER>
 </soap:Header>
   <soap:Body>
     <SENSITIVEDATA xmlns="http://tempuri.org/" />
   </soap:Body>
</soap:Envelope>