2012-05-21 32 views
5

Se me ha pedido que cree una API para clientes. Antes de comenzar tengo algunas preguntas. Decidí usar la tecnología ASP.NET Web API. Creé mi primer método y funciona bien, puedo devolver un conjunto de resultados de productos en formato XML/Json. El problema es que cualquiera que acceda a mi API en mi sitio web podrá ver todos mis productos. Ya tengo una base de datos de clientes, ¿cómo puedo usar esto para que antes de acceder a mi API tengan que establecer algunas credenciales?ASP.NET Web API Questions - Autorización/Autenticación

La API debe ser accesible tanto para clientes Web y de Escritorio

Una manera pensé en hacerlo, es que pasan a su nombre de usuario/contraseña junto como parámetros, pero esto no parecía muy seguro/derecha ?. Por ejemplo: api/products/GetById/750?username=bob&pass=123

Respuesta

7

usted podría utilizar AuthorizeAttribute para decorar sus controladores/acciones.

[Authorize] 
public IEnumerable<Product> Get() {...} 

Esto puede restringir sus recursos para estar disponible solo para usuarios autenticados.

El método de autenticación real es otra historia. De forma predeterminada, la API web utiliza autenticación de formularios ASP.NET basada en cookies, lo cual es bueno si la API se consume directamente desde un cliente web html + js.

Por otro lado, si su API va a ser consumida por aplicaciones de escritorio/móviles o un cliente web base de plugins, puede ser mejor utilizar autenticación HTTP básica, ya que no tendría que administrar cookies (recuerde usar SSL en este escenario)

Es posible que desee consultar la publicación de mi blog en http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/ que muestra cómo proporcionar la autenticación http básica que utiliza la membresía ASP.NET y los proveedores de roles.

+0

Esto es genial, pero ¿cómo podría un cliente ingresar sus credenciales para ser autorizado? ¿Tendría que exponer un método? – CallumVass

+0

Depende de la plataforma del cliente que esté utilizando. Por ejemplo, con .NET WebClient probablemente establezca la propiedad WebClient.Credentials. –

3

Definitivamente no a través de la cadena de consulta.

¿Por qué no utilizar la membresía de ASP.NET? MSDN

Como alternativa, puede escribir su propia autenticación y comprobar si el usuario tiene los permisos adecuados antes de devolver la lista de productos.

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

+0

Sí, pero ¿cómo iban a pasar en sus credenciales al proveedor de pertenencia/Custom Authenticator antes de acceder a mi api? – CallumVass

+1

@DarrenDavies no, no con REST usted no puede, él está usando Web API. – mattytommo

+1

@BiffBaffBoff - Mira esto: http://sixgun.co.uk/blog/2012/02/29/asp-net-web-api-basic-authentication/ –

3
  • desea alojar su API dentro de una carpeta SSL. Eso va a cifrar todas las comunicaciones (mismo que enviar su tarjeta de crédito # a través de Internet)

  • También puede cifrar la URL por lo que leerá así:

    api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834

    Pero esto representa un reto ya ahora tiene que sincronizar el método de encriptación utilizado por su cliente

  • También puede usar tokens, y hacer que su cliente recupere un token con fecha de vencimiento. Los tokens caducan (1 hora o 1 día, etc.). A continuación, el URL puede tener este aspecto:

    api/products/GetById/750?token=1241824123yxxcn2r348

  • También puede utilizar las teclas privadas/públicas: MSDN

+0

SSL es para encriptar las comunicaciones, pero realmente no tiene nada que ver con la autorización o autenticación, de lo que se trataba la pregunta. –

+1

Aunque el título de la pregunta es sobre Autorización y Autenticación, le preocupa pasar las credenciales del cliente. SSL ayudará a minimizar el riesgo. –

0

Usar una combinación de Nombre de usuario/Contraseña es correcto, pero en lugar de pasar por la cadena de consulta, hágalo de una manera más estandarizada (Autenticación HTTP básica) que debe agregar esta información al encabezado de solicitud del mensaje. Esto es lo que el código se vería así:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1"); 
//Add a header to the request that contains our credentials 
//DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store. 
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test")); 
req.Headers.Add("Authorization", "Basic " + svcCredentials); 

Usted pregunta se etiqueta con ambos y 'Web API' 'WCF' por lo inspeccionando el lado del servidor de credenciales es un poco diferente. Sin embargo, esencialmente tira del encabezado 'Autorización' e inspecciona las credenciales para ver si el usuario está autenticado y autorizado. Si no están autenticados, devuelva un mensaje HTTP 401.

Para WCF REST servicios basados ​​alojados en IIS, se puede ver un ejemplo detallado completo de una entrada de blog mío:

Using Basic Authentication In REST Based Services Hosted in IIS