You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
7.1 KiB

  1. using Business.BusinessLogic.Auth;
  2. using Business.TokenManagement;
  3. using Common.Models.RequestResponse;
  4. using Common.Utility;
  5. using log4net;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Configuration;
  9. using System.Linq;
  10. using System.Net;
  11. using System.Net.Http;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. using System.Web.Http;
  15. using System.Web.Http.Filters;
  16. namespace ThirdPartyAPIs.CustomFilter
  17. {
  18. public class ApplicationAuthenticationFilter : IFilter, IAuthenticationFilter
  19. {
  20. public bool AllowMultiple => true;
  21. public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
  22. {
  23. var shouldSkipAuthorization = context.ActionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Any() ||
  24. context.ActionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Any();
  25. if (!shouldSkipAuthorization)
  26. {
  27. HttpResponseMessage _responseMessage = new AuthenticationHelper().CheckApiAuthenticationValidation(context);
  28. if (_responseMessage != null)
  29. {
  30. context.ErrorResult = new FailureResult(_responseMessage);
  31. }
  32. }
  33. return Task.FromResult(0);
  34. }
  35. public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
  36. {
  37. return Task.FromResult(0);
  38. }
  39. }
  40. public class FailureResult : IHttpActionResult
  41. {
  42. public HttpResponseMessage _errorMessage { get; private set; }
  43. public FailureResult(HttpResponseMessage errorMessage)
  44. {
  45. _errorMessage = errorMessage;
  46. }
  47. public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
  48. {
  49. return Task.FromResult(_errorMessage);
  50. }
  51. }
  52. public class AuthenticationHelper
  53. {
  54. private readonly ILog log = LogManager.GetLogger(typeof(ApplicationAuthenticationFilter));
  55. private readonly ITokenManagementServices _tokenManagementServices;
  56. private TPResponse _apiResponse = new TPResponse();
  57. private HttpResponseMessage _responseMessage;
  58. public AuthenticationHelper()
  59. {
  60. _tokenManagementServices = new TokenManagementServices(new AuthServices());
  61. }
  62. public HttpResponseMessage CheckApiAuthenticationValidation(HttpAuthenticationContext context)
  63. {
  64. try
  65. {
  66. List<string> validApiRequistContentType = new List<string>() {
  67. "application/json",
  68. "application/json; charset=utf-8",
  69. "application/xml",
  70. "application/pdf",
  71. "application/soap+xml"
  72. };
  73. var user = context.Principal.Identity.IsAuthenticated ? context.Principal.Identity.Name : "No Name";
  74. LogicalThreadContext.Properties["client_ip_address"] = new GetClientIpAddress().GetIpAddress(context.Request);
  75. LogicalThreadContext.Properties["user_name"] = user;
  76. // Check ContainType Valid or Not
  77. var contentTypeName = (context.Request.Content.Headers.Contains("Content-Type") ? context.Request.Content.Headers.GetValues("Content-Type").FirstOrDefault() : "");
  78. if (!validApiRequistContentType.Contains(contentTypeName))
  79. {
  80. //_apiResponse.ErrorType = "unsupportedMediaType";
  81. _apiResponse.Msg = "Media Type expected: 'application/json'.";
  82. _apiResponse.ResponseCode = "1";
  83. log.Error(_apiResponse.Msg);
  84. return _responseMessage = context.Request.CreateResponse(HttpStatusCode.BadRequest, _apiResponse);
  85. }
  86. string msg = "";
  87. if (!CheckApiAccessKey(context.Request, ref msg))
  88. {
  89. //_apiResponse.ErrorType = "Access Key";
  90. _apiResponse.Msg = msg.ToString();
  91. _apiResponse.ResponseCode = "1";
  92. log.Error(_apiResponse.Msg);
  93. return _responseMessage = context.Request.CreateResponse(HttpStatusCode.NotAcceptable, _apiResponse);
  94. }
  95. //else if (!CheckTokenValidation(context.Request, ref msg))
  96. //{
  97. // //_apiResponse.ErrorType = "Token No";
  98. // _apiResponse.Msg = msg.ToString();
  99. // _apiResponse.ErrorCode = "1";
  100. // log.Error(_apiResponse.Msg);
  101. // return _responseMessage = context.Request.CreateResponse(HttpStatusCode.Unauthorized, _apiResponse);
  102. //}
  103. }
  104. catch (Exception ex)
  105. {
  106. _apiResponse.ResponseCode = "1";
  107. _apiResponse.Msg = "Api Access Key Not Match";
  108. LogicalThreadContext.Properties["exception"] = ex;
  109. log.Error(_apiResponse.Msg);
  110. _responseMessage = context.Request.CreateResponse(HttpStatusCode.InternalServerError, _apiResponse);
  111. context.ErrorResult = new FailureResult(_responseMessage);
  112. }
  113. return _responseMessage;
  114. }
  115. public bool CheckApiAccessKey(HttpRequestMessage request, ref string msg)
  116. {
  117. //IEnumerable<string> authHeaders;
  118. IEnumerable<string> apiAccessKeys;
  119. if (!request.Headers.Contains("apiAccessKey") || !request.Headers.TryGetValues("apiAccessKey", out apiAccessKeys) || apiAccessKeys.Count() > 1)
  120. {
  121. msg = "Api Access Key Is Required On Headers";
  122. return false;
  123. }
  124. var apiAccessKey = apiAccessKeys.ElementAt(0);
  125. if (apiAccessKey != ConfigurationManager.AppSettings["apiAccessKey"].ToString())
  126. {
  127. msg = "Api Access Key Not Match";
  128. return false;
  129. }
  130. return true;
  131. }
  132. public bool LoginOnSystem(HttpRequestMessage request, ref string msg)
  133. {
  134. //bool isVl
  135. if (!request.Headers.Contains("tokenNo") && !request.Headers.Contains("username") && !request.Headers.Contains("password"))
  136. {
  137. msg = "Please Include Header With Your Valid Login Credential";
  138. return false;
  139. }
  140. else if (request.Headers.GetValues("tokenNo").FirstOrDefault() != "1234567890")
  141. {
  142. msg = "Token No Not Match";
  143. return false;
  144. }
  145. return true;
  146. }
  147. public bool CheckTokenValidation(HttpRequestMessage request, ref string msg)
  148. {
  149. if (!request.Headers.Contains("tokenNo"))
  150. {
  151. msg = "Token No Is Required On Headers";
  152. return false;
  153. }
  154. string tokenNo = request.Headers.GetValues("tokenNo").FirstOrDefault();
  155. return _tokenManagementServices.CheckTokenNo(tokenNo, ref msg);
  156. }
  157. }
  158. }