using Neo.Afx.Services.Security; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net; using System.Net.Http; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; namespace Neo.LegitimateLicences.Api.Helpers { public class AuthorizationHeaderHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { IEnumerable apiKeyHeaderValues = null; IEnumerable userKeyHeaderValues = null; var isValidUser = false; var taskCompletionSource = new TaskCompletionSource(); if (request.RequestUri.AbsolutePath.ToLower().Contains("/1.0/login")) //login only requires an API key { if (request.Headers.TryGetValues("api_Key", out apiKeyHeaderValues)) { var apiKeyHeaderValue = apiKeyHeaderValues.First(); if (apiKeyHeaderValue == ConfigurationManager.AppSettings["LegitimateLicencesApiKey"]) { var identity = new ClaimsIdentity(); var principal = new ClaimsPrincipal(identity); Thread.CurrentPrincipal = principal; isValidUser = true; await base.SendAsync(request, cancellationToken).ContinueWith(t => taskCompletionSource.SetResult(t.Result)); } } } else { if (request.Headers.TryGetValues("api_Key", out apiKeyHeaderValues) && request.Headers.TryGetValues("api_User", out userKeyHeaderValues)) { var apiKeyHeaderValue = apiKeyHeaderValues.First(); var userKeyHeaderValue = userKeyHeaderValues.First(); var securityDatabase = new SecurityDatabase(); var user = securityDatabase.GetUser(userKeyHeaderValue); if (apiKeyHeaderValue == ConfigurationManager.AppSettings["LegitimateLicencesApiKey"] && user != null) { var nameClaim = new Claim(ClaimTypes.Name, user.Email); var emailClaim = new Claim(ClaimTypes.Email, user.Email); var userClaim = new Claim("UserID", user.UserID.ToString()); var identity = new ClaimsIdentity(new[] { nameClaim, emailClaim, userClaim }, "api_Key"); var principal = new ClaimsPrincipal(identity); Thread.CurrentPrincipal = principal; isValidUser = true; await base.SendAsync(request, cancellationToken).ContinueWith(t => taskCompletionSource.SetResult(t.Result)); } } } if (!isValidUser) { taskCompletionSource.SetResult(new HttpResponseMessage(HttpStatusCode.Unauthorized)); } return await taskCompletionSource.Task; } } }