2010-06-23 15 views
13

Java tabanlı bir Axis2 web hizmetine (denetimimin dışında) bağlanan bir WCF istemcisi var. WS-Security'nin uygulanmasına başlamak üzeredir ve .NET istemcisini düzeltmem gerekiyor. Bununla birlikte, doğru kimlik doğrulamayı sağlamak için uğraşıyorum. WSE 3.0'ın daha kolay yapılabileceğinin farkındayım, ancak eski bir teknolojiye dönmemeyi tercih ederim.WCF istemcisinde WS-Güvenlik ile Axis 2 web hizmetini tüketirken hata UserToken PasswordDigest kimlik doğrulama şeması

Benzer sorunlar (çözülmemiş), this, this ve this'u içerir.

şu şekilde görünmelidir SOAP mesajı: Ancak

<wsse:UsernameToken> 
    <wsse:Username><!-- Removed--></wsse:Username> 
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"><!-- Removed--></wsse:Password> 
    <wsse:Nonce><!-- Removed--></wsse:Nonce> 
    <wssu:Created>2010-05-28T12:50:33.675+01:00</wssu:Created> 
</wsse:UsernameToken> 

, maden şuna benzer:

<s:Header> 
<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"></h:Security> 
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<u:Timestamp u:Id="_0"> 
<u:Created>2010-06-23T10:31:23.441Z</u:Created> 
<u:Expires>2010-06-23T10:36:23.441Z</u:Expires> 
</u:Timestamp> 
<o:UsernameToken u:Id="uuid-d329b3b2-6a1f-4882-aea6-ec6b8a492de7-1"> 
<o:Username> 
<!-- Removed--> 
</o:Username> 
<o:Password> 
<!-- Removed--> 
</o:Password> 
</o:UsernameToken> 
</o:Security> 
</s:Header> 

Müvekkilim şöyle görünür: dip not gerekli SecurityHeaderType param not alın. O nedir? aşağıdaki gibi

public MyAck SendRequest(MyRequest request) 
{ 
RemoteServicePortTypeClient client = new RemoteServicePortTypeClient(); 

client.ClientCredentials.UserName.UserName = "JAY"; 
client.ClientCredentials.UserName.Password = "AND"; 

    // what is the difference between the two different Credential types?? 
    //client.ClientCredentials.HttpDigest.ClientCredential.UserName = "SILENT"; 
    //client.ClientCredentials.HttpDigest.ClientCredential.Password = "BOB"; 

SecurityHeaderType sht = new SecurityHeaderType(); 
//sht.Any = ???; // How do I use this??? 
//sht.AnyAttr = ???; // How do I use this ??? 

// SecurityHeaderType is a required parameter 
return client.RemoteServiceOperation_Provider(sht, request); 
} 

Güncel bağlama geçerli:

<basicHttpBinding> 
    <binding name="CustomBinding"> 
     <security mode="TransportWithMessageCredential"> 
      <transport clientCredentialType="None"></transport> 
      <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

Ben de özel bir bağlama çalıştı ve benzer bir hata var:

<customBinding> 
    <binding name="myCustomBindingConfig"> 
    <security authenticationMode="UserNameOverTransport" 
     messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11" 
     securityHeaderLayout="Strict" 
     includeTimestamp="false"></security> 
    <textMessageEncoding messageVersion="Soap11"></textMessageEncoding> 
    <httpsTransport /> 
    </binding> 
</customBinding> 

Ve son nokta (Adres besbelli değişti ...):

<endpoint address="https://www.somecompany.com/uat/axis/services/RemoteServiceOperation_Provider" 
     binding="basicHttpBinding" bindingConfiguration="CustomBinding" 
     contract="RemoteService.RemoteServicePortType" 
     name="RemoteService_UAT" /> 

c Ben özel başlıklar, jeton, bağlar hakkında çok okudum

<ErrorID>0</ErrorID> 
<ErrorType>UNEXPECTED</ErrorType> 
<ErrorDescription><![CDATA[Array index out of range: 0]]></ErrorDescription> 
<TimeStamp>2010-06-23T13:28:54Z</TimeStamp> 

beynim tamamen karıştı şu şekildedir: iade ediliyor ustom hatam. İletiyi doğru biçimde göndermek için herkes adım adım önerebilir mi? Özel belirteçler kullanarak WCF için ileriye doğru yol gibi görünüyor, ancak bir tane gerektiği gibi sindirme ve içsiz uygulama nasıl yapılmalıdır?

Herhangi bir yardım memnuniyetle karşılandı. Ben bazı sınırlı başarı elde ettik

GÜNCELLEME. Doğru özetle bir UsernameToken oluşturmak için Microsoft.Web.Services3 kitaplığı kullandım.Sonra kendi özel davranışı oluşturduk ve BeforeSendRequest yönteminde ben başlığını enjekte şunları yaptık: Öyle gibi davranış eklemek

object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
{ 
    UsernameToken ut = new UsernameToken("USERNAME", "PASSWORD", PasswordOption.SendHashed); 

    XmlElement securityElement = ut.GetXml(new XmlDocument()); 

    MessageHeader myHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityElement, false); 
    request.Headers.Add(myHeader); 

    return Convert.DBNull; 
} 

:

CustomBehavior behavior = new CustomBehavior("USERNAME", "PASSWORD"); 
client.Endpoint.Behaviors.Add(behavior); 

şimdi görebiliyorum başlıkları arasında gidiş:

<s:Header> 
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsse:UsernameToken wsu:Id="SecurityToken-c6aeb72d-4d36-4650-abd3-33cc66caac6d" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<wsse:Username> 
<!-- Removed--> 
</wsse:Username> 
<wsse:Password> 
<!-- Removed--> 
</wsse:Password> 
<wsse:Nonce> 
<!-- Removed--> 
</wsse:Nonce> 
<wsu:Created>2010-06-24T16:23:58Z</wsu:Created> 
</wsse:UsernameToken> 
</Security> 
</s:Header> 

Ama hatayı alıyorum:

<soapenv:Fault> 
<faultcode xmlns="">soapenv:Server</faultcode> 
<faultstring xmlns="">WSDoAllReceiver: security processing failed; nested exception is: 
    org.apache.ws.security.WSSecurityException: General security error (WSSecurityEngine: Callback supplied no password for: USERNAME)</faultstring> 
<faultactor xmlns="">urn:Remote_Provider</faultactor> 
<detail xmlns=""> 
<CUSTOMError xmlns="urn:customerror:v01"> 
<ErrorID>0</ErrorID> 
<ErrorType>UNEXPECTED</ErrorType> 
<ErrorDescription><![CDATA[WSDoAllReceiver: security processing failed; nested exception is: 
    org.apache.ws.security.WSSecurityException: General security error (WSSecurityEngine: Callback supplied no password for: USERNAME)]]></ErrorDescription> 
<TimeStamp>2010-06-24T17:23:59Z</TimeStamp> 
</CUSTOMError> 
</detail> 
</soapenv:Fault> 
güvenlik izleme ve kayıt ayarları özelliklerini ve bu düğümlerin içerikler kaldırılmaktadır battaniye varsa

Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest" 

Ancak, emin değilim:

şifre düğümünde bir eksik Tipi nitelik olduğu görülmektedir. Tanılama günlüğünde logKnownPii ayarını kullanmaya çalıştım, ancak güvenlik bilgileri gizlenmiyor. Bunun hakkında bir fikrin var mı?

cevap

5

Sorumun gelen GÜNCELLEME gerçekten çalışıyor teyit edebiliriz:

object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
{ 
    UsernameToken ut = new UsernameToken("USERNAME", "PASSWORD", PasswordOption.SendHashed); 

    XmlElement securityElement = ut.GetXml(new XmlDocument()); 

    MessageHeader myHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityElement, false); 
    request.Headers.Add(myHeader); 

    return Convert.DBNull; 
} 

Ve müşteri:

CustomBehavior behavior = new CustomBehavior("USERNAME", "PASSWORD"); 
client.Endpoint.Behaviors.Add(behavior); 

hata mesajı ilgisiz oldu. güvenlik başlığı çok basit basicHttpBinding çalışır: Uygulamasına ait

<basicHttpBinding> 
    <binding name="BasicSOAPBinding"> 
     <security mode="Transport" /> 
    </binding> 
</basicHttpBinding> 

kod örneği blogumda bulunabilir: http://benpowell.org/supporting-the-ws-i-basic-profile-password-digest-in-a-wcf-client-proxy/

+0

Maalesef bu gelecekte kaybolabilir şeye benziyor. ONVIF spesifikasyonları şu şekildedir: "Bu standartta tanımlanan hizmetler, [WS-UsernameToken] özelliğini destekleyen eski cihazlar haricinde [RFC 2617] 'ye göre özet kimlik doğrulaması kullanılarak korunmalıdır." Kaynak: https://www.onvif.org/specs/core/ONVIF-Core-Specification-v1706.pdf 5.12.1 – cube45

1

Son zamanlarda benzer bir sorun yaşadım ve WSE olmayan bir çözümü aramayı bıraktım. Birkaç gün sonra saçlarımı çektikten sonra WSE 3.0 SDK'sını indirdim, WseWsdl3.exe kullanarak bir proxy sınıfı oluşturdum ve UsernameToken için yeni bir politika oluşturdum. 15 dakika içinde koşuyordum. Aşağıdaki şu anda benim için çalışıyor.

RemoteService service = new RemoteService(); //generated class 

UsernameToken token = new UsernameToken(username, password, PasswordOption.SendPlainText); 
Policy policy = new Policy(); 
policy.Assertions.Add(new UsernameOverTransportAssertion()); 

service.SetClientCredential(token); 
service.SetPolicy(policy); 

var result = service.MethodCall(); 
2

Bu soru iyi yazılır - çok teşekkür. @ Junto'nun "Bunu nasıl kullanırım" yorumuna atıfta bulunursak, servis yönteminde SecurityHeader parametresinin üstbilgi eklemek için kullanılabileceği ortaya çıkmaktadır. Aşağıda bir örnek ekledim. Neler olduğunu, SvcUtil.exe aracının WS * DTD'lerini okumaya çalışırken bariz olduğunu düşünüyorum. "Hizmet Referansı Ekle" sihirbazını kullandığınızda bu açık değildir. Ama svcutil.exe komut satırından çalıştırdığınızda çok açıktır. Svcutil.exe WS * DTD'lerini okumadığından, SecurityHeader nesnesi iyi geliştirilmemiş. Ancak Microsoft size .Any özelliği ile bir dışarı verir. UsernameToken sınıfını doğrudan .Any özelliğine serileştirebilirsiniz ve başlığınız iletiye eklenir. Yine, bu mükemmel soru için teşekkürler.

Gerekli aletler:

Fiddler2 (or similar) -- you really can't figure any of this out without inspecting the http headers.

Gerekli Referans:

Microsoft.Web.Services3.dll -- you can reference this 2.0 framework assembly from your 4.0 assembly 

WCF hizmeti çağrısı

Nasıl UsernameToken güvenlik başlığı eklemek için SecurityHeader parametresini kullanmak:

// Initialization of the service... 
_service = new MyService("MyEndpoint", RemoteUri); 

// etc.  

// Calling the service -- note call to GetSecurityHeader() 
_service.ServiceAction(GetSecurityHeader(), "myParam1"); 

// etc. 

/// <summary> 
/// Construct the WSE 3.0 Security Header 
/// </summary> 
private SecurityHeader GetSecurityHeader() 
{ 
    SecurityHeader h = new SecurityHeader(); 
    UsernameToken t = new UsernameToken(RemoteLogin, RemotePassword, PasswordOption.SendPlainText); 
    h.Any = new XmlElement[1]; 
    h.Any[0] = t.GetXml(new XmlDocument()); 
    return h; 
} 

App.config:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="MyBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" 
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="1048576" maxBufferPoolSize="524288" maxReceivedMessageSize="1048576" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="Transport"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://myservice.com/service.asmx" 
      binding="basicHttpBinding" bindingConfiguration="MyBinding"    contract="MyContract" 
      name="MyEndpoint" /> 
    </client> 
    </system.serviceModel> 
+0

GetSecurityHeader() benim için yaptı, teşekkürler! – Robotron

İlgili konular