Как будет аутентифицироваться клиент php или java, если я использую WCF с авторизацией форм? - PullRequest
3 голосов
/ 05 февраля 2009

У меня есть общее доказательство концепции службы WCF, которая использует проверку подлинности с помощью форм для безопасного доступа. Все отлично работает, когда мой клиент .NET (код vb ниже)

Dim client As SupplierServiceClient = New SupplierServiceClient()
client.ClientCredentials.UserName.UserName = "xxxx@xxx.xx.xx"
client.ClientCredentials.UserName.Password = "password"

Dim SupplierList As List(Of Supplier) = client.GetSuppliers()

но, поскольку я хочу, чтобы это взаимодействовало с любым, кто может сделать SOAP 1.1 / 1.2, - как бы подключился клиент PHP или Java?

Мой WCF web.config указан ниже (к вашему сведению)

<system.serviceModel>
    <services>
        <service name="SampleApplicationWCF.Library.SupplierService" behaviorConfiguration="NorthwindBehavior">
            <endpoint address="" name="wsHttpSupplierService" contract="SampleApplicationWCF.Library.ISupplierService" binding="wsHttpBinding" bindingConfiguration="wsHttp"/>
            <endpoint address="https://server/SampleApplicationWCF/SupplierService.svc/Basic" name="basicHttpSupplierService" contract="SampleApplicationWCF.Library.ISupplierService" binding="basicHttpBinding" bindingConfiguration="basicHttp"/>
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Ответы [ 2 ]

8 голосов
/ 19 января 2011

Мне удалось аутентифицировать PHP-клиента, но не без особых усилий. Сначала я попробовал следующее:

$header = new stdClass;
$credentials = new stdClass;
$credentials->Username="myuser";
$credentials->Password="mypass";
$header->UsernameToken = $credentials;

$securityNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$client->__setSoapHeaders($securityNamespace, 'Security', $header);

Это не сработало. Кажется, что PHP5 (v5.3.5 в моем случае) имеет ошибку, препятствующую появлению префикса пространства имен внутри вложенных тегов заголовка. http://bugs.php.net/bug.php?id=48966
Я закончил с:

<UsernameToken><Username>myuser</Username><Password>myuser</Password></UsernameToken>

вместо:

<o:UsernameToken><o:Username>myuser</o:Username><o:Password>myuser</o:Password></o:UsernameToken>

Итак, мне пришлось жестко закодировать необходимый XML в переменной. Это уродливо, но работает:

$securityNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$headerContent = "<o:Security xmlns:o=\"$securityNamespace\">
                    <o:UsernameToken>
                    <o:Username>myuser</o:Username>
                    <o:Password>mypass</o:Password>
                    </o:UsernameToken>
                </o:Security>";
$headerVar = new SoapVar($headerContent, XSD_ANYXML, null, null, null);
$header = new SoapHeader($securityNamespace, 'o:Security', $headerVar);
$client->__setSoapHeaders(array($header));

Надеюсь, это кому-нибудь пригодится. Bye!

1 голос
/ 05 февраля 2009

Отказ от ответственности: я НЕ разработчик Java или PHP

Устанавливая значения UserName в клиентской oject, вы указываете WCF передавать эту информацию по проводам как часть заголовка SOAP. Поскольку SOAP является очень широко принятым стандартом, я уверен, что есть библиотеки, которые помогут вам добавить эту информацию в заголовок сообщения SOAP. Я бы искал что-то, что поможет вам использовать сервисы с использованием спецификаций WS- * и / или WS-I Basic Profile.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...