C# SOAP头:Flex和C之间的安全通信#

C# SOAP头:Flex和C之间的安全通信#,c#,apache-flex,security,web-services,soapheader,C#,Apache Flex,Security,Web Services,Soapheader,我正在使用Flex、Webservices和C#,我希望通过SOAP保护对web服务的访问 我花了两天时间解决这个问题: 我描述我的webmethod的asmx文件: public ServiceAuthHeader CustomSoapHeader = new ServiceAuthHeader(); [SoapHeader("CustomSoapHeader")] [WebMethod(Description = "Return Somme")] publ

我正在使用Flex、Webservices和C#,我希望通过SOAP保护对web服务的访问

我花了两天时间解决这个问题:

我描述我的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头的内容是 好

}

到目前为止,我认为我是对的

但是,虽然我想在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通过阅读不同的答案帮助了我很多,但今天我仍然坚持下去。如果有人能帮忙的话。

我只使用自定义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;
    }
public函数addUserCredentials(用户名:String,密码hash:String):ISoapInvocation
{
var headerDetails:XML=
{username}
{passwordHash}
;
securityHeader=新的SOAPHeader(securityQName,headerDetails);
归还这个;
}

请记住,在E4X定义中使用{}看起来像是一个更新的绑定,而不是。

非常感谢,Sophistifunk

我最后添加了我的生成为子类

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);
var头1:SOAPHeader;
变量q1:QName=新的QName(“http://localhost:80/“,”标题“);
header1=新的SOAPHeader(q1,{});
变量a:XML=
乔
试验
header1.content=a;
_serviceControl.addHeader(header1);
但是,当我们通过Flex4的IDE在Flex4中实现一个新的Web服务时,所有内容都是在AS中生成的

但是管理页眉的方法真的很糟糕

它将自动负责安全标头。。我的意思是创建一个函数setLogin或setpassword,可从或mxml应用程序绑定

无论如何


如果有人知道一种更好的方法来管理SOAP的头。

你的Flex代码没有给我太多的东西。您是否在QName组件中使用WebService标记?您读过关于从Flex向Soap请求添加头的文档吗?
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);