ASP.NET Web API 2: ¿Cómo iniciar sesión con servicios de autenticación externos?

De acuerdo con este post http://www.asp.net/web-api/overview/security/external-authentication-services … puedo iniciar sesión con el servicio de autenticación local (con el nuevo framework de identidad Asp.net)

pero no puede encontrar un walktrough para llamar correctamente (desde una aplicación móvil o un cartero ) la API web predeterminada generada en la plantilla de Visual Studio 2013 SPA.

¿Alguien puede ayudarme?

Tuve el mismo problema hoy y encontré la siguiente solución:

Al principio, obtenga todos los proveedores disponibles

GET /api/Account/ExternalLogins?returnUrl=%2F&generateState=true 

El mensaje de respuesta es una lista en formato json

 [{"name":"Facebook", "url":"/api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1", "state":"QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1"}] 

Ahora envíe una solicitud GET a la url del proveedor que desea usar. Serás redirigido a la página de inicio de sesión del proveedor externo. Complete sus credenciales y será redirigido a su sitio. Ahora analiza el access_token desde la url.

 http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1 

Si el usuario ya tiene una cuenta local, la cookie .AspNet.Cookies está configurada y listo. De lo contrario, solo se .AspNet.ExternalCookie cookie .AspNet.ExternalCookie y debe registrar una cuenta local.

Hay una API para averiguar si el usuario está registrado:

 GET /api/Account/UserInfo 

La respuesta es

 {"userName":"xxx","hasRegistered":false,"loginProvider":"Facebook"} 

Para crear una cuenta local para el usuario, llame

 POST /api/Account/RegisterExternal Authorization: Bearer VPcd1RQ4X... (access_token from url) Content-Type: application/json {"UserName":"myusername"} 

Ahora envíe la misma solicitud con la URL del proveedor como antes

 GET /api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1 

Pero esta vez el usuario ya tiene una cuenta y se autentica. Puede verificar esto llamando nuevamente a /api/Account/UserInfo .

Ahora extrae el access_token de la url. Authorization: Bearer [access_token] agregar el encabezado Authorization: Bearer [access_token] a cada solicitud que realice.

Encontré otra publicación que muestra detalles bonitos sobre cómo funciona esta autenticación externa. El cliente es WPF y el servidor usa ASP.NET Identity.