2012-03-28 21 views
5

He creado un servicio web RESTful simple (solo GET, por ahora) utilizando Microsoft ASP.NET MVC 4 ApiController.Microsoft MVC 4, APIController y un servicio web de inicio de sesión RESTful adecuado

Ahora estoy buscando la forma correcta de implementar un sistema de autorización para el servicio. Sé que no quiero usar el FormsAuthentication incorporado, ya que no quiero tener una página de inicio de sesión única para todas las aplicaciones que usan mi WS; además, eso rompe el paradigma RESTful, forzando una redirección y no notificando al cliente con el código de estado apropiado 401.

Por eso ha desactivado FormsAuthentication borrar las siguientes líneas de mi web.config:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

y añadiendo lo siguiente:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="FormsAuthentication" /> 
</modules> 

Ya tengo una ApiController para gestionar el inicio de sesión del usuario, lo que básicamente cheques las credenciales en mi base de datos y devuelve el usuario o 401 si las credenciales no son válidas.

He leído que tengo que implementar la API Membership y Authorization, pero no encontré nada que me ayude desde el principio. ¿Tiene alguna idea? ¿Debo administrar cookies y authcodes en la base de datos o hay una clase similar al FormsAuthentication que lo hace por mí?

Respuesta

3

Encontré una solución, básicamente utilicé la solución que se muestra en el example de Microsoft.

  1. Crea una carpeta llamada App_Start.
  2. Ponga el twoclasses con los espacios de nombres adecuados.
  3. FormsAuthentication y el sistema adicional de manejo de solicitud/respuesta harán el resto.

Dado que no me gusta el "Contenido trasladó aquí" en mi respuesta 401, he editado el método OnEndRequest esta manera:

private void OnEndRequest(object source, EventArgs args) 
    { 
     var context = (HttpApplication)source; 
     var response = context.Response; 

     if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup")) 
     { 
      response.StatusCode = (int)context.Context.Items[FixupKey]; 
      response.RedirectLocation = null; 
      // Clear the page content, since I don't want the "Content moved here." body 
      response.ClearContent(); 
     } 
    } 

Referencias:

2

Ver esto project on github. Han desarrollado algunas clases, con ejemplos, para agregar seguridad a ASP.NET Web API. Uno de los modelos de seguridad compatibles es la autenticación básica, que parece ser lo que está describiendo en su pregunta.

+0

Parece que necesito el primer ejemplo, 'BasicAuthentication'. Pero todavía no he entendido si hay una manera de almacenar el código de autenticación (no enviaré nombre de usuario y contraseña al cliente como código de autenticación) en una base de datos. – frapontillo

+0

No estoy seguro de entender lo que quiere decir con "una forma de almacenar el código de autenticación". ¿Cuál es tu descripción del authcode? Con la autenticación básica, desea codificar el nombre de usuario/contraseña enviado y decodificarlo en el otro extremo.También desea usar HTTPS/SSL/TSL con autenticación básica para encriptar todo el mensaje en el cable. Cuando almaceno contraseñas en un DB, siempre uso el cifrado de una manera para la contraseña almacenada. Luego, usa la misma encriptación en la contraseña ingresada por el usuario antes de hacer una comparación de lo que está en la base de datos. –

+0

Me gustaría crear un authcode temporal para cada inicio de sesión y almacenarlo en una base de datos. Lo cual creo que es lo mismo que hace FormsAuthentication: crea un código de autorización de sesión estrictamente vinculado al usuario registrado. – frapontillo

Cuestiones relacionadas