SOAP标头:在Flex和C#之间保护通信

时间:2010-05-17 16:24:51

标签: c# flex security web-services soapheader

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

我在这个问题上花了两天时间:

我的asmx文件,我描述了我的webmethod:

    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 Header的内容是  好。

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通过阅读不同的答案帮助了我很多,但今天我仍然坚持下去。如果有人可以提供帮助。

2 个答案:

答案 0 :(得分: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定义中使用{}看起来像更新的绑定,但不是。

答案 1 :(得分:0)

非常感谢,Sophistifunk

我终于添加了我生成的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中生成。

但管理标题的方法真的很糟糕。

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

反正。

如果有人知道如何以更好的方式掌控SOAP标题。