permettre à un utilisateur de se connecter à l'API
Vous avez besoin d'envoyer un valide cookie d'Authentification de Formulaires avec la demande. Ce cookie est généralement envoyé par le serveur lors de l'authentification (LogOn
action) par l'appel de la [FormsAuthentication.SetAuthCookie
méthode (voir MSDN).
Donc, le client doit effectuer 2 étapes:
- Envoyer une requête HTTP à un
LogOn
action par l'envoi du nom d'utilisateur et mot de passe. À tour de rôle cette action fera appel à la FormsAuthentication.SetAuthCookie
méthode (dans le cas où les informations sont valides) qui à son tour permettra de définir le cookie d'authentification de formulaires dans la réponse.
- Envoyer une requête HTTP à un
[Authorize]
protégé de l'action en envoyant le long du cookie d'authentification de formulaires, il est récupéré de la première demande.
Prenons un exemple. Supposons que vous disposez de 2 contrôleurs d'API définies dans votre application web:
Le premier responsable de la gestion de l'authentification:
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;
}
}
et la deuxième contenant protégés actions que seuls les utilisateurs autorisés peuvent voir:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Maintenant, nous pourrions écrire une application cliente la consommation de cette API. Voici une simple application console exemple (assurez-vous que vous avez installé l' Microsoft.AspNet.WebApi.Client
et Microsoft.Net.Http
packages 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");
}
}
}
}
Et voici comment les 2 requêtes HTTP regard sur le fil:
Demande d'authentification:
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"}
Réponse d'authentification:
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
Demande de la protection des données:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Réponse de la protection des données:
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"