ちょうど今、Webサービス認証を取得しましたが、次のように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()」メソッドを呼び出さずに、コード内にあるSOAPヘッダー--SoapHeader( "LoginSoapHeader")-のみを使用して、このWebMethodを認証したいと思います。
次に、私の質問は、ヘッダーのみを使用してWebMethodを認証するにはどうすればよいですか?
前もって感謝します。
要件は、WebサービスクライアントがWebメソッドにアクセスするときにユーザー名とパスワードを提供する必要があることです。
これは、httpヘッダーではなくカスタムsoapヘッダーを使用して実現します。
.NET Frameworkでは、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>