permitir que un usuario inicie sesión en la API
Debe enviar una cookie de autenticación de formularios válida junto con la solicitud. Esta cookie generalmente la envía el servidor cuando se autentica ( LogOn
acción) llamando al [FormsAuthentication.SetAuthCookie
método (consulte MSDN ).
Entonces el cliente necesita realizar 2 pasos:
- Envíe una solicitud HTTP a una
LogOn
acción enviando el nombre de usuario y la contraseña. A su vez, esta acción llamará al FormsAuthentication.SetAuthCookie
método (en caso de que las credenciales sean válidas) que a su vez establecerá la cookie de autenticación de formularios en la respuesta.
- Envíe una solicitud HTTP a una
[Authorize]
acción protegida mediante el envío de la cookie de autenticación de formularios que recuperó en la primera solicitud.
Pongamos un ejemplo. Suponga que tiene 2 controladores API definidos en su aplicación web:
El primero responsable de manejar la autenticación:
public class AccountController : ApiController
{
public bool Post(LogOnModel model)
{
if (model.Username == "john" && model.Password == "secret")
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return true;
}
return false;
}
}
y el segundo que contiene acciones protegidas que solo los usuarios autorizados pueden ver:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Ahora podríamos escribir una aplicación cliente que consuma esta API. He aquí un ejemplo de aplicación de consola trivial (asegúrese de que ha instalado el Microsoft.AspNet.WebApi.Client
y Microsoft.Net.Http
paquetes NuGet):
using System;
using System.Net.Http;
using System.Threading;
class Program
{
static void Main()
{
using (var httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(
"http://localhost:26845/api/account",
new { username = "john", password = "secret" },
CancellationToken.None
).Result;
response.EnsureSuccessStatusCode();
bool success = response.Content.ReadAsAsync<bool>().Result;
if (success)
{
var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
Console.WriteLine(secret.Result);
}
else
{
Console.WriteLine("Sorry you provided wrong credentials");
}
}
}
}
Y así es como se ven las 2 solicitudes HTTP en el cable:
Solicitud de autenticación:
POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive
{"username":"john","password":"secret"}
Respuesta de autenticación:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close
true
Solicitud de datos protegidos:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Respuesta para datos protegidos:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close
"This is a top secret material that only authorized users can see"