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