0

私は Flex、Webservices、および C# を使用しており、SOAP を介して Web サービスへのアクセスを保護したいと考えています。

私はこの問題に2日を費やしました:

私のwebmethodを説明する私のasmxファイル:

    public ServiceAuthHeader CustomSoapHeader  = new ServiceAuthHeader();

    [SoapHeader("CustomSoapHeader")]
    [WebMethod(Description = "Return Somme")]
    public int getTotal(int x, int y)
    {
        ServiceAuthHeaderValidation.Validate(CustomSoapHeader);
        var total = x+y;
        return total;
    }


  public class ServiceAuthHeader : SoapHeader
    {
        // SoapHeader for authentication
        public string Username;
        public string Password;
    }

次に、SOAP ヘッダーの内容が適切かどうかをチェックするクラスを作成しました。

public class ServiceAuthHeaderValidation
{

[SoapHeader("soapHeader")]
[WebMethod(Description = "Check Header")]
public ServiceAuthHeader Validate(ServiceAuthHeader soapHeader)
{
    if (soapHeader == null)
    {
        throw new NullReferenceException("No soap header was specified.");                    
    }
    if (soapHeader.Username ==null)
    {
        Console.WriteLine(soapHeader.Username);
        throw new NullReferenceException("Username was not supplied for authentication in SoapHeader!");
    }
    if (soapHeader.Password == null)
    {
        throw new NullReferenceException("Password was not supplied for authentication in SoapHeader.");
    }

    if (soapHeader.Username != "JOE") || soapHeader.Password != "JOE")
    {
        throw new Exception("Please pass the proper username and password for this service.");


   }
    return true;
}

}

これまでのところ、私は正しいと思います。

しかし、Flexで実装したいのですが:

var q1:QName=new QName("http://localhost:59399/Service1.asmx?wsdl", "Header1");
        header1=new SOAPHeader(q1, {String:"JOE",String JOE});
        _serviceControl.addHeader(header1); 

ユーザー名に NullReferenceException が発生しましたが、これは提供されていないようです。

実装しようとする場合を除いて、私のWebサービスは機能します。

ServiceAuthHeaderValidation.Validate(CustomSoapHeader);

何が欠けているかを知るために誰かが私に返信できますか? または私の間違い..

お時間をいただきありがとうございます。

これまでのところ、StackoverFlow はさまざまな回答を読むことで私を大いに助けてくれましたが、今日はそれに固執しています。誰かが助けることができれば。

4

2 に答える 2

0

どうもありがとう、ソフィストファンク

最後に、生成された AS サブクラスに追加しました。

var header1:SOAPHeader;
        var q1:QName = new QName("http://localhost:80/", "Header");     
        header1 = new SOAPHeader(q1, {});
        var a:XML = <AuthHeader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://localhost:80/">
                    <UserLogin>Joe</UserLogin> 
                    <mdp>test</mdp> 
                    </AuthHeader>
        header1.content =  a;
        _serviceControl.addHeader(header1);

しかし、IDE を介して Flex 4 に新しい WebService を実装すると、すべてが AS で生成されます。

しかし、ヘッダーを管理する方法は本当にひどいです。

これは、セキュリティ ヘッダーを自動的に担当する必要があります。つまり、mxml アプリケーションからバインド可能な関数 setLogin または setpassword を作成します。

ともかく。

誰かがより良い方法で SOAP のヘッダーを担当する方法を知っている場合。

于 2010-05-18T14:02:13.620 に答える
0

カスタム XML を使用するだけです。

    public function addUserCredentials(username:String, passwordHash:String):ISoapInvocation
    {
        var headerDetails:XML =
            <Security xmlns={wsse}>
                <UsernameToken>
                    <Username>{username}</Username>
                    <Password>{passwordHash}</Password>
                </UsernameToken>
            </Security>;

        securityHeader = new SOAPHeader(securityQName, headerDetails);

        return this;
    }

E4X 定義内で {} を使用すると、更新されるバインディングのように見えますが、そうではないことに注意してください。

于 2010-05-18T01:38:52.863 に答える