В настоящее время мы работаем над проектом, в котором нам нужно получить доступ к API веб-сервисов Sharepoint Foundation на сайте Sharepoint 2016, использующем аутентификацию на основе требований. Служба токена безопасности, используемая для подачи заявок, представляет собой ADFS 2.0, размещенную на сервере Win2k12. Пользователь должен представить свой адрес электронной почты для аутентификации и получения маркера безопасности для дальнейших операций.Сайт Sharepoint на основе утверждений и связь с Apache CXF STSClient
Примечание: Поскольку это установка DEV мы используем самоподписанный сертификат для конечной точки ADFS
Мы используем Apache CXF 2.7.12 и JDK 8 в качестве стека разработки клиента для доступа к этому веб оказание услуг. Когда мы запрашиваем токен, исключение, связанное с отказом утверждения HttpsToken, регистрируется на уровне WARNING, а затем ничего не происходит. Вызов не завершен, и мы должны убить процесс.
Поскольку это первый раз, когда мы используем CXF; запросить некоторую помощь и рекомендации в отношении решения этой проблемы. Мы ссылались на следующие сайты для первоначального расследования, но ни один из них не кажется, что помогает нам с этой конкретной проблемы:
Using Apache CXF to connect CRM Dynamics
Apache CXF Client Configuration options
Ниже WS-Policy для сайта Sharepoint как доступны на URL
<wsp:Policy wsu:Id="UserNameWSTrustBinding_IWSTrust13Async_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding>
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedEncryptedSupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedEncryptedSupportingTokens>
<sp:EndorsingSupportingTokens>
<wsp:Policy>
<sp:KeyValueToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Never" wsp:Optional="true"/>
<sp:SignedParts>
<sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
</sp:SignedParts>
</wsp:Policy>
</sp:EndorsingSupportingTokens>
<sp:Wss11>
<wsp:Policy/>
</sp:Wss11>
<sp:Trust13>
<wsp:Policy>
<sp:MustSupportIssuedTokens/>
<sp:RequireClientEntropy/>
<sp:RequireServerEntropy/>
</wsp:Policy></sp:Trust13>
<wsaw:UsingAddressing/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
теперь настроить STSClient следующим образом:
STSClient spSTSClient = new STSClient(bus);
spSTSClient.setTrust(new Trust10(SP12Constants.INSTANCE));
spSTSClient.setSoap12();
//would we also also need to set the token type and key type?
// spSTSClient.setTokenType("urn:oasis:names:tc:SAML:2.0:assertion");
//spSTSClient.setKeyType("http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer");
spSTSClient.setWsdlLocation("https://myadfsserver.com/adfs/services/trust/mex");
spSTSClient.setServiceName("{http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}SecurityTokenService");
spSTSClient.setEndpointName("{http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}UserNameWSTrustBinding_IWSTrust13Async");
spSTSClient.setAddressingNamespace("http://www.w3.org/2005/08/addressing"); String sharePointUsername = “[email protected]";
String sharePointPassword = “foobar#”;
SecurityToken secToken = spsSTSClient.requestSecurityToken("http://mysharepointsite.com/_trust");
requestSecurityToken
вызов бросает предупреждение, которое показано ниже:
WARNING: Interceptor for {http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}SecurityTokenService#{http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice}Trust13IssueAsync has thrown exception, unwinding now
org.apache.cxf.ws.policy.PolicyException: Assertion of type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}HttpsToken could not be asserted: Not an HTTPs connection
at org.apache.cxf.ws.security.policy.interceptors.HttpsTokenInterceptorProvider$HttpsTokenOutInterceptor.assertHttps(HttpsTokenInterceptorProvider.java:144)
at org.apache.cxf.ws.security.policy.interceptors.HttpsTokenInterceptorProvider$HttpsTokenOutInterceptor.handleMessage(HttpsTokenInterceptorProvider.java:87)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
Спасибо за этот ответ. Я понял, что это опечатка в коде. Однако даже после этого изменения; проблема все еще сохраняется. Единственный способ обойти эту проблему - указать переопределение политики с пустой политикой WSP. Но я знаю это * Hack *. Любые другие советы по устранению неполадок будут отличными. Кроме того, с этой пустой политикой XML ошибка Https исчезла, но теперь я получаю сообщение об ошибке {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}TransportBinding: Полученная временная метка не соответствует требования. Что это значит? –