【问题标题】:Problem with authentication on java wsjava ws上的身份验证问题
【发布时间】:2009-12-20 09:25:34
【问题描述】:

我有使用 Java WS 的 C# 应用程序。在 WS 配置为使用身份验证之前,一切正常。现在我应该用户登录我的密码来执行来自 WS 的方法,但我不知道该怎么做。 我试过了

var client = new MyBeanClient();
                    client.ClientCredentials.UserName.UserName = "admin";
                    client.ClientCredentials.UserName.Password = "";
                    client.addConsumer("whatever", "", "", "");

但我明白了 SecurityMessageException-{"HTTP 请求未经客户端授权 身份验证方案“匿名”。收到的身份验证标头 服务器是“协商,NTLM”。”} InnerException - (WebException) - {"远程服务器返回错误: (401) 未经授权。"}.

怎么了?

谢谢

【问题讨论】:

    标签: c# java web-services authentication


    【解决方案1】:

    试试这个:

    var credentialCache = new CredentialCache();
    var credentials = new NetworkCredential("username", "password", "domain");
    credentialCache.Add(new Uri(client.Url), "NTLM", credentials);
    client.Credentials = credentialCache;
    client.addConsumer("whatever", "", "", "");
    

    更新:

    抱歉,在我的第一篇文章中,我以为您使用的是wsdl.exe 来生成客户端代理。对于 WCF 客户端,您需要配置端点:

    var basicHttpBinding = new BasicHttpBinding();
    basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
    basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
    var endpoint = new EndpointAddress("http://example.com/myWindowsAuthN");
    var client = new MyBeanClient(basicHttpBinding, endpoint);
    client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    
    client.ChannelFactory.Credentials.Windows.ClientCredential.Domain = "domain";
    client.ChannelFactory.Credentials.Windows.ClientCredential.UserName = "username";
    client.ChannelFactory.Credentials.Windows.ClientCredential.Password = "password";
    


    更新2:

    我已使用以下配置来调用受 NTLM 身份验证保护的 Web 服务。在客户端的 app.config 中放入以下内容:

    <system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="NtlmBinding">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="Ntlm" />
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>
      <client>
        <endpoint
          address="http://example.com/SomeWindowsAuthenticatedService"
          binding="basicHttpBinding"
          bindingConfiguration="NtlmBinding"
          contract="IOperationContractOfTheService"
          name="WSTestSoap" />
      </client>
    </system.serviceModel>
    

    然后您可以在调用该方法之前设置相应的凭据:

    using (var client = new MyBeanClient())
    {
        client.ChannelFactory.Credentials.Windows.ClientCredential = 
            new NetworkCredential("username", "password", "DOMAIN");
        client.addConsumer("whatever", "", "", "");
    }
    

    【讨论】:

    • 不幸的是,客户端没有 Credentials 字段。只有 ClientCredentials 属性,但它是只读的:/ 客户端也没有属性 Url:/
    • 还是有同样的问题:/ SecurityMessageException :/
    • 您好,谢谢您的回答。你能告诉我我应该写成“DOMAIN”吗??
    • 您的帐户所属的域的名称。为了使 NTLM 身份验证正常工作,您需要设置 Active Directory。
    • 我不知道为什么我必须使用域帐户?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多