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