Web services 根据GlassFish领域对WS-Security UsernameToken进行身份验证;“拒绝认证”;

Web services 根据GlassFish领域对WS-Security UsernameToken进行身份验证;“拒绝认证”;,web-services,jakarta-ee,glassfish,ws-security,java-metro-framework,Web Services,Jakarta Ee,Glassfish,Ws Security,Java Metro Framework,我在GlassFish 3.1.1中运行的EAR的EJB子项目中使用@webservice声明了一个SOAP webservice,它使用绑定的Metro运行时。在类级别上,它被注释为通常的@DeclareRoles和@RolesAllowed 我有一个WSIT描述符,用于使用简单的明文密码UsernameToken进行身份验证 在EAR的glassfish-application.xml中,我将领域指定为glassfish附带的标准文件领域。在这个领域中,我添加了一个测试用户,属于一个特定的组

我在GlassFish 3.1.1中运行的EAR的EJB子项目中使用@webservice声明了一个SOAP webservice,它使用绑定的Metro运行时。在类级别上,它被注释为通常的@DeclareRoles和@RolesAllowed

我有一个WSIT描述符,用于使用简单的明文密码UsernameToken进行身份验证

在EAR的glassfish-application.xml中,我将领域指定为glassfish附带的标准文件领域。在这个领域中,我添加了一个测试用户,属于一个特定的组。该组映射到我在glassfish-ejb-jar.xml中指定的角色

我还启用了GlassFish中的安全管理器以及审计。完成此操作后,我重新启动了服务器

我已经生成了一个客户端,并在回调处理程序中设置了用户名和密码。我登录以确保确实设置了凭据。我还尝试如下设置凭据:

Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, "myUsername");
requestContext.put(BindingProvider.PASSWORD_PROPERTY, "myPassword");
  <ns1:Policy xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/09/policy" wsu:Id="MyServicePortBindingPolicy">
    <ns1:ExactlyOne>
      <ns1:All>
    <ns2:SupportingTokens xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
      <ns1:Policy>
        <ns1:ExactlyOne>
          <ns1:All>
        <ns2:UsernameToken ns2:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
          <ns1:Policy>
            <ns1:ExactlyOne>
              <ns1:All>
            <ns2:WssUsernameToken10 />
              </ns1:All>
            </ns1:ExactlyOne>
          </ns1:Policy>
        </ns2:UsernameToken>
          </ns1:All>
        </ns1:ExactlyOne>
      </ns1:Policy>
    </ns2:SupportingTokens>
    <ns3:UsingAddressing xmlns:ns3="http://www.w3.org/2006/05/addressing/wsdl" />
      </ns1:All>
    </ns1:ExactlyOne>
  </ns1:Policy>
我从客户那里得到这个信息:

Authentication of Username Password Token Failed
javax.xml.ws.soap.SOAPFaultException: Authentication of Username Password Token Failed
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:122)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:140)
然后,我创建了一个简单的servlet/JSP项目,并在领域上添加了一个安全限制。在这种情况下,使用同一用户进行身份验证是有效的

WS-Security策略如下所示:

Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, "myUsername");
requestContext.put(BindingProvider.PASSWORD_PROPERTY, "myPassword");
  <ns1:Policy xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/09/policy" wsu:Id="MyServicePortBindingPolicy">
    <ns1:ExactlyOne>
      <ns1:All>
    <ns2:SupportingTokens xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
      <ns1:Policy>
        <ns1:ExactlyOne>
          <ns1:All>
        <ns2:UsernameToken ns2:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
          <ns1:Policy>
            <ns1:ExactlyOne>
              <ns1:All>
            <ns2:WssUsernameToken10 />
              </ns1:All>
            </ns1:ExactlyOne>
          </ns1:Policy>
        </ns2:UsernameToken>
          </ns1:All>
        </ns1:ExactlyOne>
      </ns1:Policy>
    </ns2:SupportingTokens>
    <ns3:UsingAddressing xmlns:ns3="http://www.w3.org/2006/05/addressing/wsdl" />
      </ns1:All>
    </ns1:ExactlyOne>
  </ns1:Policy>


这里怎么了?非常感谢您的建议。

当我禁用自己的HomeBake编程身份验证机制时,这就解决了问题,该机制引发了破坏性异常。真不敢相信我以前没想到