2009-11-23 18 views
7

Quiero hacer una aplicación para teléfono móvil con Windows Mobile 6. Esta aplicación hablará con un servicio web que quiero hacer.¿Cómo hacer la autenticación entre un servicio web y un teléfono móvil?

No sé mucho sobre los servicios web y la aplicación de programación para teléfonos, así que tengo un par de preguntas.

  1. ¿Cómo hago la autenticación? Al igual que mi usuario carga mi aplicación y va a la página de inicio de sesión. Teclean sus credenciales. Esto se envía al servidor y se autentica. ¿Ahora qué envío? ¿Hay algún tipo de FormsAuthentication?

  2. Después de iniciar sesión, ¿tengo que seguir haciendo comprobaciones para ver si están conectadas? Al igual que en asp.net mvc, tengo AuthorizeAttributes en todas mis etiquetas. De esta forma, nadie puede ingresar la URL a ese método de acción y poder acceder a ella. Pero dado que esta es una aplicación, no estoy seguro si podrían (digamos) ir a su formulario de inicio de sesión (primer formulario) y luego de alguna manera, sin iniciar sesión, llegar a su formulario principal (el que está después del formulario de inicio de sesión).

  3. ¿Los servicios web tienen Autorizar etiquetas como asp.net mvc? Ya que probablemente necesite algo así para asegurarme de que nadie escriba en su navegador web la ruta de mi servicio web y obtener acceso a todos los métodos que hice en él.

  4. Estoy haciendo una aplicación asp.net mvc ahora mismo y cuando el usuario escribe sus credenciales en mi sitio. Se envía lo que supongo que es texto claro? al servidor hash y luego verificado. Sé que un día, cuando pueda pagarlo, tal vez logre que SSL sea más seguro.

Así que mi pregunta ¿qué tal con el envío de las credenciales desde el teléfono al servidor será menos seguro de lo que tengo para mi sitio web ahora mismo? ¿Sobre lo mismo? Qué se puede hacer para que sea más seguro (¿es SSL de nuevo?).

Gracias

Respuesta

9

También podría usar encabezados SOAP para pasar las credenciales del usuario o el token de autenticación.Usted puede encontrar un artículo sobre cómo hacer esto en Authentication for Web Services (using SOAP headers), pero para resumir, se crea una clase de cabecera:

using System.Web.Services.Protocols; 

public class AuthHeader : SoapHeader 
{ 
    public string Username; 
    public string Password; 
} 

Se define una propiedad pública en el servicio web

public AuthHeader AuthenticationInfo; 

y agregar algunos atributos a cualquiera de los métodos web que le gustaría ser accesible sólo a los usuarios autenticados:

[SoapHeader ("AuthenticationInfo", Required=true)] 
[WebMethod] 
public string HelloSecretWorld() 
{ 
    if(!(AuthenticationInfo.UserName == "Hello" && AuthenticationInfo.UserName.Password == "World")) 
     throw new AuthenticationException(); 

    return "Hello World"; 
} 

El código de cliente se vería así:

MyWebService ws = new MyWebService(); 
ws.AuthenticationInfo = new AuthHeader {Username = "Hello", Password = "World"}; 
Console.Out.WriteLine(ws.HelloSecretWorld()); 

De esta manera no es necesario modificar las firmas de los métodos para agregar autenticación.

+0

¿Tendría que enviar las credenciales siempre en cada acción? Me parece que creaste un nuevo webServiceObject. Entonces, respondo que voy a otro formulario en la aplicación de mi teléfono y hago un nuevo objeto de servicio web. ¿Debo volver a enviar las credenciales? – chobo2

+0

También podría enviar el token de autenticación en lugar de las credenciales. En ese caso, primero pediría al token que pase el token en sus credenciales (ya sea como un encabezado SOAP o como parámetros de métodos web regulares) y luego usará otro encabezado SOAP con una sola propiedad (Token) para todas las demás llamadas a métodos web. De esta forma, no necesita usar SSL para otras llamadas mientras mantiene la seguridad lejos de sus firmas de métodos. –

+0

¿Qué es un token de autenticación? ¿Cómo lo genero? ¿Qué sucede si quiero agregar una verificación de función a esta autenticación? Como si tuviera 3 roles y algunos métodos solo pueden ser utilizados por ciertos roles. Entonces tendría que verificar eso también. – chobo2

0

que he tenido que tratar este tema varias veces en la conexión de las aplicaciones portátiles (Windows Mobile) a los servicios web. La solución que he utilizado es crear una cookie basada en un hash del nombre de usuario y la dirección IP del usuario una vez que el proceso de autenticación ha tenido éxito. p.ej. ID de usuario y pwd coinciden con las credenciales persistentes en el servidor. A continuación, le devuelve esta cookie al cliente, que luego pasará junto con todas las solicitudes de servicio web para el resto de la sesión. p.ej. El primer parámetro de cualquier método web es la cookie.

pseudocódigo:

string cookie = webServiceInstance.Authenticate("userName", "password"); 
double balance = webServiceInstance.GetBalance(cookie, someId); 

Por supuesto que desea utilizar SSL con el fin de evitar pasar su ID de usuario y pwd en texto plano.

Cuestiones relacionadas