Używam aplikacji MVC 4 Web Api i chcę, aby użytkownicy zostali uwierzytelnieni, zanim skorzystają z mojej usługi.Jak używać klucza Api w Web Api do uwierzytelniania usług przy użyciu uwierzytelniania formularzy
Zaimplementowałem procedurę obsługi komunikatów autoryzacji, która działa dobrze.
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);
}
}
Problem polega na tym, że używam uwierzytelniania formularzy.
[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);
}
Kiedy zadzwonić do mojego API:
[Authorize]
public class TestController : ApiController
{
public string GetLists()
{
return "Weee";
}
}
Handler nie może znaleźć nagłówek X-ApiKey.
Czy istnieje sposób na dodanie klucza API użytkownika do nagłówka odpowiedzi http i utrzymanie klucza w tym miejscu, o ile użytkownik jest zalogowany? Czy istnieje inny sposób wdrożenia tej funkcji?
Dzięki! Masz rację miałem na myśli uwierzytelnianie formularzy. Zmieniłem moje pytanie. Nie korzystam z dostawcy członkostwa, zamiast tego utworzyłem niestandardową logikę uwierzytelniania. Nie mogę używać HttpRequestMessage, ponieważ wykonuję moje uwierzytelnianie za pomocą kontrolera MVC i zwracam wynik działania (lub nie wiem, jak go użyć). –