Sto utilizzando MVC 4 Web Api e voglio che gli utenti vengano autenticati, prima di utilizzare il mio servizio.Come utilizzare la chiave Api in Web Api per l'autenticazione del servizio utilizzando l'autenticazione moduli
Ho implementato un gestore di messaggi di autorizzazione, che funziona bene.
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);
}
}
Il problema è che utilizzo l'autenticazione dei moduli.
[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);
}
Quando chiamo il mio api:
[Authorize]
public class TestController : ApiController
{
public string GetLists()
{
return "Weee";
}
}
Il conduttore non riesce a trovare l'intestazione X-apikey.
C'è un modo per aggiungere la chiave api dell'utente all'intestazione della risposta http e mantenere la chiave lì, purché l'utente abbia effettuato l'accesso? Esiste un altro modo per implementare questa funzionalità?
Grazie! Hai ragione intendevo l'autenticazione basata su moduli. Ho modificato la mia domanda. Non sto utilizzando un provider di appartenenze, ma ho creato una logica di autenticazione personalizzata. Non riesco a utilizzare HttpRequestMessage, perché eseguo l'autenticazione tramite MVC Controller e restituisco un risultato di azione (o non conosco un modo per usarlo). –