web-dev-qa-db-ja.com

Webサービスヘッダー認証

ちょうど今、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を認証するにはどうすればよいですか?

前もって感謝します。

7
guisantogui

要件は、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>
17
Durai Amuthan.H