Comment utiliser une clé Api dans l'Api Web service pour l'authentification à l'aide de l'authentification par formulaires
Je suis en utilisant MVC 4 Web Api et je veux que les utilisateurs soient authentifiés, avant d'utiliser mon service.
J'ai mis en place une autorisation du gestionnaire de messages, qui fonctionne très bien.
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);
}
}
Le problème, c'est que j'utilise l'authentification par formulaires.
[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);
}
Quand je l'appelle mon api:
[Authorize]
public class TestController : ApiController
{
public string GetLists()
{
return "Weee";
}
}
Le gestionnaire ne peut pas trouver le X-ApiKey en-tête.
Est-il un moyen d'ajouter de l'utilisateur de la clé api à la tête de réponse http et de garder la touche là, aussi longtemps que l'utilisateur est connecté?
Est-il une autre façon de mettre en œuvre cette fonctionnalité?
OriginalL'auteur Ivan Stoyanov | 2013-04-22
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé l'article suivant http://www.asp.net/web-api/overview/working-with-http/http-cookies
En l'utilisant j'ai configuré mon AuthorizationHandler à utiliser des cookies:
J'ai configuré ma Connexion résultat action:
À l'intérieur je suis l'aide de la CookieHelper, que j'ai créé. Il consiste en une interface:
Et une classe qui implémente l'interface:
En ayant cette configuration, je peux maintenant utiliser l'Autoriser attribut pour mon ApiControllers:
Cela signifie que si l'utilisateur n'est pas connecté. Il ne peut pas accéder à mon api et reçoit une erreur 401. Aussi, je peux récupérer la clé de l'api, dont je me sers comme d'un ID utilisateur, n'importe où dans mon code, ce qui le rend très propre et lisible.
Je ne pense pas que l'utilisation de cookies est la meilleure solution, comme certains l'utilisateur peut avoir désactivé dans leur navigateur, mais pour le moment je n'ai pas trouvé une meilleure façon de faire de l'autorisation.
OriginalL'auteur Ivan Stoyanov
À partir de votre code échantillons, il ne semble pas que vous êtes à l'aide de Formulaires Web. Pourriez-vous être à l'aide de l'Authentification par Formulaires? Êtes-vous en utilisant le Fournisseur d'appartenances à l'intérieur de votre service de valider les informations d'identification utilisateur?
Vous pouvez utiliser la classe HttpClient et peut-être sa propriété DefaultRequestHeaders ou un HttpRequestMessage du code qui va être l'appel de l'API pour définir les en-têtes.
Ici il y a quelques exemples de HttpClient:
http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
OriginalL'auteur Ezequiel