2010-09-29 20 views
5

Tengo un caso de uso donde un UIWebView puede necesitar conectarse con un servidor web asegurado con NTLM. También tengo un caso de uso en el que ya tengo las credenciales para aprobar. Entonces, en lugar de forzar al usuario a ingresarlos, ¿cómo realizo el saludo con el UIWebView?¿Cómo implementar la Autenticación NTLM para UIWebView?

ACTUALIZACIÓN:

uso de este método here funciona bastante bien cuando usted está haciendo peticiones GET simples, pero completamente falla al hacer postes, por el mero hecho de que se está haciendo un GET después de que se registró.

ASIHttpRequest y ASIWebPageRequest tienen el mismo problema. Las solicitudes GET funcionan de maravilla, pero cualquier POST simplemente no funciona. Si solo el mundo trabajara en solo solicitudes GET.

He podido usar this method de incluir el nombre de usuario y la contraseña en la cadena de solicitud HTTP, pero eso es tan inseguro que desafía la razón para usarlo. Usando un sniffer, puedo ver que el handshake de tres vías ocurre sin ningún problema en las solicitudes GET y POST.

Respuesta

1

A partir de iOS 3.2 y 4.1, no hay delegado público para interceptar el desafío NTLM. Sin embargo, hay una API privada que se puede anular para brindar el soporte adecuado para esto. Como esto pondría su aplicación en peligro de ser rechazada, me abstendré de publicar el código porque no tiene valor para el desarrollo de la tienda de aplicaciones en este momento.

+3

Sin embargo, el código sería realmente útil para las personas que escriben aplicaciones internas. –

-1

UIWebView no admite autenticación en absoluto. Hasta iPhone OS 3.1, podría agregar credenciales al almacenamiento de credenciales central y UIWebView al menos funcionaría con autenticación básica. Pero a partir de iOS 4.0, no veo ninguna forma de usar la autenticación (excepto la autenticación de formularios basados ​​en cookies o URL).

+0

no es cierto, algunas de las otras respuestas proporcionan formas de autenticar una página web para que sus usuarios no vean nada. – Aaron

0

Si está dispuesto a probar algún código experimental, puede usar ASIWebPageRequest.

Sería un poco hacky, ya que tendría que descargar el contenido de la página con ASIWebPageRequest, cargarlo en un UIWebView, capturar los clics de enlace en la vista web y repetir el proceso nuevamente (si el contenido del URL requiere autenticación). Además, creo que tendrías que administrar tu propia pila de historial.

No creo que sea fácil, pero parece factible, y parece que debería funcionar, siempre y cuando el código ASIWebPageRequest no tenga errores o limitaciones.

+0

He estado jugando con sus clases, pero no con esa específica. Lo probaré. –

+0

No funciona con POST. –

+0

Dangit. Puede intentar lo que se describe aquí: http://stackoverflow.com/questions/3918512/objective-c-webkit-external-files-causing-401/3919181#3919181, pero no tengo idea de qué método de autenticación (si corresponde) corresponde a NTLM. –

2

Puede configurar la credencial por defecto:

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
              initWithHost: _host 
              port: 80 
              protocol: @"http" 
              realm: _host 
              authenticationMethod:NSURLAuthenticationMethodNTLM]; 

[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceForSession] forProtectionSpace:protectionSpace]; 

Ahora usted puede dejar a sus webviews hacer la petición, y cuando se encuentra con su protenctionSpace se registra en el uso de las credenciales dadas

+0

Esto funciona para mi aplicación, ¡gracias! – Aaron

Cuestiones relacionadas