Заголовок SOAP: связь между Flex и C # защищена - PullRequest
0 голосов
/ 17 мая 2010

Я работаю с Flex, Webservices и C # и хотел бы защитить доступ к своим веб-службам через SOAP.

Я потратил 2 дня на эту проблему:

Мой файл 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 для моего имени пользователя, которое, похоже, не указано.

Мой веб-сервис работает, кроме случаев, когда я пытаюсь реализовать:

ServiceAuthHeaderValidation.Validate(CustomSoapHeader);

Может ли кто-нибудь ответить мне, чтобы узнать, чего не хватает? или моя ошибка ..

Спасибо за ваше время.

Пока StackoverFlow мне очень помог, читая разные ответы, но сегодня я застрял на этом. Если кто-то может помочь.

Ответы [ 2 ]

0 голосов
/ 18 мая 2010

Большое спасибо, 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);

Но когда мы внедряем новый WebService во Flex 4 через его IDE, все создается в AS.

Но способ управления заголовком - отстой.

Это должно автоматически отвечать за заголовок безопасности. Я имею в виду создание функции setLogin или setpassword, привязываемой из приложения mxml.

В любом случае.

Если кто-то знает способ взять верх над заголовком SOAP лучшим способом.

0 голосов
/ 18 мая 2010

Я просто использую пользовательский 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 выглядит как привязка, которая обновляется.

...