有没有可靠的方法来处理Android应用程序的Windows集成(NTLM)身份验证?

时间:2011-08-12 07:54:19

标签: java android web-services authentication ntlm

正如标题所述,我们正在寻找一种方法来访问Windows集成(NTLM)身份验证背后的.NET 3.5 Web服务。

我们整整一周都在搜索互联网和本论坛,我们还没有找到解决这个问题的方法。

我们尝试过,DefaultHttpConnections,HttpPost,HttpGet等的不同变体。

然而,我们试图验证自己,我们遇到了这些:

    SSLHandshakeException

   Authentication scheme ntlm not supported
   Authentication error: Unable to respond to any of these challenges: 
   ntlm=WWW-Authenticate: NTLM, negotiate=WWW-Authenticate: Negotiate

IIS身份验证设置如下: enter image description here

我们尝试访问的页面是默认站点的子文件夹中的.aspx,我们没有优势,也没有将身份验证更改为默认站点的安全性。

我知道互联网中的许多其他人都有类似的问题。

而且,我们正在开发的应用程序不应该使用Web视图。

任何关于如何解决这个问题的建设性指示都将受到高度赞赏。提前致谢。




更新:我们现在已更改服务以执行基本身份验证和ntlm身份验证。

当我们将下面的代码运行到localhost测试服务器时,我们得到了正确的响应,localhost没有任何类型的身份验证机制。答复如下:

<soap:Body>
<FooResponse xmlns="uri:FlexAPI">
<FooResult>
<typeFooBar>
<FooNumber>4545</FooNumber>
<BarNumber>1</BarNumber>
</typeFooBar>
</FooResult>
</FooResponse>
</soap:Body>

但是,当我们在经过身份验证的服务器上运行以下代码时,我们就会知道这一点。

org.xmlpull.v1.XmlPullParserException:expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}信封  (位置:在java.io.InputStreamReader@4054b398中START_TAG @ 2:44)

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);



        request.addProperty("Foo", Bar.getText().toString());
        request.addProperty("Foo", Bar.getText().toString());
        request.addProperty("Foo", Bar() );
        request.addProperty("Foo", Bar.getText().toString());



        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);


        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        envelope.encodingStyle = "utf-8";
        envelope.implicitTypes = false;

        String myUrlz= "http://" + myUrl.getText().toString() +"/Foo/Bar.asmx"; 



        HttpTransportBasicAuth auth = new HttpTransportBasicAuth(myUrlz, "Foo", "Bar");

        auth.debug = true;

try
{

auth.call(SOAP_ACTION, envelope); // Fails on this line. 
System.out.println("Dump" + auth.responseDump);


// all the other stuff.....


}
catch (FooException Bar)
{

                // ¯\_(ツ)_/¯

}

基本上,我们在访问受保护的服务时接受了html响应而不是xml。是的,除了身份验证部分之外,localhost服务和敏锐服务完全相同。

2 个答案:

答案 0 :(得分:1)

简短的回答是否定的,在Android上没有开箱即用的NTLM方法。

很长的答案是,使用Apache HttpClient成功尝试将您自己的解决方案混合在一起。请参阅以下链接:

http://danhounshell.com/blog/android-using-ntlm-authentication-with-httpclient/ http://mrrask.wordpress.com/2009/08/21/android-authenticating-via-ntlm/

答案 1 :(得分:0)

Android设备无法为其不属于的Windows域提供有效的NTLM令牌。

您唯一的选择是将服务器上的身份验证机制更改为更合适的方式。如果您需要限制对页面的访问权限,可以使用以下选项:

  • 基本身份验证(通过http或超过https)
  • 基于表单的身份验证(通过http或over https)
  • 使用SSL证书身份验证的https(Android appserver side
  • 使用Oauth的公共页面(通过http或hhtps)
  • 包含OpenID的公共页面(通过http或hhtps)