Ermöglichen Sie einem Benutzer, sich bei der API anzumelden
Sie müssen zusammen mit der Anfrage ein gültiges Formularauthentifizierungs-Cookie senden. Dieses Cookie wird normalerweise vom Server bei der Authentifizierung ( LogOn
Aktion) durch Aufrufen der [FormsAuthentication.SetAuthCookie
Methode gesendet (siehe MSDN ).
Der Client muss also zwei Schritte ausführen:
- Senden Sie eine HTTP-Anfrage an eine
LogOn
Aktion, indem Sie den Benutzernamen und das Passwort senden. Diese Aktion ruft abwechselnd die FormsAuthentication.SetAuthCookie
Methode auf (falls die Anmeldeinformationen gültig sind), die wiederum das Formularauthentifizierungscookie in der Antwort setzt.
- Senden Sie eine HTTP-Anforderung an eine
[Authorize]
geschützte Aktion, indem Sie das Formularauthentifizierungs-Cookie senden, das in der ersten Anforderung abgerufen wurde.
Nehmen wir ein Beispiel. Angenommen, in Ihrer Webanwendung sind zwei API-Controller definiert:
Der erste, der für die Authentifizierung verantwortlich ist:
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;
}
}
und die zweite enthält geschützte Aktionen, die nur autorisierte Benutzer sehen können:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Jetzt könnten wir eine Client-Anwendung schreiben, die diese API verwendet. Hier ist ein einfaches Anwendungsbeispiel für eine Konsole (stellen Sie sicher, dass Sie die Pakete Microsoft.AspNet.WebApi.Client
und Microsoft.Net.Http
NuGet installiert haben ):
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");
}
}
}
}
Und so sehen die 2 HTTP-Anforderungen auf dem Draht aus:
Authentifizierungsanforderung:
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"}
Authentifizierungsantwort:
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
Anfrage für geschützte Daten:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Antwort für geschützte Daten:
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"