permitir que un usuario inicie sesión en el API
Es necesario enviar una cookie de autenticación de formularios válidos junto con la solicitud. Esta cookie generalmente la envía el servidor al autenticar (acción LogOn
) llamando al método [FormsAuthentication.SetAuthCookie
(consulte MSDN).
lo que el cliente necesita para realizar 2 pasos:
- envía una solicitud HTTP a una acción
LogOn
enviando el nombre de usuario y contraseña. Por turnos, esta acción llamará al método FormsAuthentication.SetAuthCookie
(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 acción protegida
[Authorize]
enviándola junto con la cookie de autenticación de formularios que recuperó en la primera solicitud.
Tomemos un ejemplo. Suponga que tiene 2 controladores de API definidas en su aplicación web:
El primer responsable de gestión de 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 contiene las acciones protegidas que sólo 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 consumiendo esta API. Aquí está un ejemplo trivial aplicación de consola (asegúrese de que ha instalado los 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 los 2 peticiones HTTP se ven en el alambre: solicitud
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
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 de 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"
Hola Mujtaba. ¿Pudiste implementar esto? –