Есть ли надежный способ справиться с аутентификацией, встроенной в Windows (NTLM), из приложения для Android? - PullRequest
11 голосов
/ 12 августа 2011

Как гласит заголовок, мы ищем способ доступа к веб-службе .NET 3.5, которая находится за встроенной аутентификацией Windows (NTLM).

Мы искали в интернете и на этом форуме всю эту неделю, и нам еще предстоит найти решение этой проблемы.

Мы пробовали, 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 в подпапке сайта по умолчанию, и у нас нет прав доступа, и при этом не безопасно сменить аутентификацию на сайт по умолчанию.

Я знаю, что у многих других в интернете есть похожие проблемы.

Кроме того, разрабатываемое нами приложение не должно использовать веб-представления.

Буду весьма признателен за любые конструктивные указания о том, как решить эту проблему. Заранее спасибо.




ОБНОВЛЕНИЕ: Мы изменили службу для выполнения базовой и ntlm-аутентификации.

Когда мы запускаем приведенный ниже код на тестовом сервере localhost, мы получаем правильный ответ, локальный хост не имеет какого-либо механизма аутентификации. Ответ следующий:

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

Однако , когда мы запускаем приведенный ниже код на нашем аутентифицированном сервере, мы получаем это.

org.xmlpull.v1.XmlPullParserException: ожидается: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (позиция: START_TAG @ 2: 44 в java.io.InputStreamReader@4054b398)

        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 и услуга sharp точно совпадают, за исключением части аутентификации.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Краткий ответ - нет, нет готового метода для NTLM на Android.

Длинный ответ: успешные попытки взломать ваше собственное решение с помощью Apache HttpClient Смотрите следующие ссылки:

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

0 голосов
/ 16 августа 2011

Невозможно, чтобы устройство Android могло иметь действительный токен NTLM для домена Windows, к которому он не принадлежит.

Единственный вариант, который у вас есть, - это изменить механизм аутентификации на сервере на более подходящий.,Если вам нужно ограничить доступ к странице, вот несколько доступных вам вариантов:

  • Базовая аутентификация (через http или через https)
  • аутентификация на основе формы (через http или болееhttps)
  • https с аутентификацией SSL-сертификата (в приложении Android и на стороне сервера )
  • публичная страница с Oauth (через http или hhtps)
  • публичная страница с OpenID (через http или hhtps)
...