Wie verwenden von Api-key in der Web-Api, die für service-Authentifizierung verwenden der Formularauthentifizierung
Ich bin mit MVC 4 Web Api und ich möchte, dass Benutzer authentifiziert werden, bevor Sie mit meinem service.
Implementierte ich eine Genehmigung message handler, der ganz gut funktioniert.
public class AuthorizationHandler : DelegatingHandler
{
private readonly AuthenticationService _authenticationService = new AuthenticationService();
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
IEnumerable<string> apiKeyHeaderValues = null;
if (request.Headers.TryGetValues("X-ApiKey", out apiKeyHeaderValues))
{
var apiKeyHeaderValue = apiKeyHeaderValues.First();
//... your authentication logic here ...
var user = _authenticationService.GetUserByKey(new Guid(apiKeyHeaderValue));
if (user != null)
{
var userId = user.Id;
var userIdClaim = new Claim(ClaimTypes.SerialNumber, userId.ToString());
var identity = new ClaimsIdentity(new[] { userIdClaim }, "ApiKey");
var principal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = principal;
}
}
return base.SendAsync(request, cancellationToken);
}
}
Das problem ist, dass ich die Verwendung der Formularauthentifizierung.
[HttpPost]
public ActionResult Login(UserModel model)
{
if (ModelState.IsValid)
{
var user = _authenticationService.Login(model);
if (user != null)
{
//Add the api key to the HttpResponse???
}
return View(model);
}
return View(model);
}
Wenn ich meinen api:
[Authorize]
public class TestController : ApiController
{
public string GetLists()
{
return "Weee";
}
}
Den handler nicht finden können, die X-ApiKey header.
Ist es ein Weg, um fügen Sie den Benutzer der api-Schlüssel, um die http-header der Antwort und halten Sie die Taste gibt es, solange der Benutzer angemeldet ist?
Gibt es eine andere Möglichkeit um diese Funktionalität zu implementieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich folgenden Artikel http://www.asp.net/web-api/overview/working-with-http/http-cookies
Ich konfigurierte meine AuthorizationHandler Verwendung von cookies:
Konfigurierte ich meine Login-action Ergebnis:
Drin ich bin mit dem CookieHelper, dass ich erstellt. Es besteht aus einem interface:
Und eine Klasse, die die Schnittstelle implementiert:
Durch diese Konfiguration, jetzt kann ich mit " aktivieren Attribut für meine ApiControllers:
Dies bedeutet, dass, wenn der Benutzer nicht eingeloggt ist. Er kann nicht auf meine api und erhält einen 401-Fehler. Auch kann ich abrufen die api-Schlüssel, mit dem ich als Benutzer-ID, irgendwo in meinem code, das macht es sehr sauber und gut lesbar.
Ich glaube nicht, dass die Verwendung von cookies ist die beste Lösung, da einige Benutzer kann diese deaktiviert in Ihrem browser, aber im moment habe ich noch nicht gefunden, eine bessere Weise zu tun, die Genehmigung.
Aus dem code-Beispiele es scheint nicht, wie Sie mit Web Forms. Könnten Sie die Formularauthentifizierung verwenden? Sind Sie mit der Mitgliedschaft der Anbieter in Ihrem service-Benutzeranmeldeinformationen?
Können Sie die HttpClient Klasse und vielleicht auch die Eigenschaft DefaultRequestHeaders oder eine HttpRequestMessage aus dem code, der den Aufruf der API, um den Header.
Hier sind einige Beispiele von HttpClient:
http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client