Wednesday, February 24, 2021

Digital signature apply to http request body

 public CheckValiedContent (HttpRequest request){

          string xeroPrivateKey = Environment.GetEnvironmentVariable("XEROKEY");

          var signatureHeader = request.Headers["x-xero-signature"];
          var requestBody = request.Body;

         var resultSignature = GenarateSignature(requestBody,xeroPrivateKey);

         if (signatureHeader != resultSignature){
            return 401
        }

 }


 public string GenerateSignature(string dataToHash, string xeroKey)
        {
            using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(xeroKey)))
            {
                var messageBytes = Encoding.UTF8.GetBytes(dataToHash);
                var hash = hmac.ComputeHash(messageBytes);
                return Convert.ToBase64String(hash);
            }
        }

Wednesday, February 10, 2021

Backend best practices

 Select praticulr coloms from database (EF)


https://git.itelasoft.com.au/chamith.saranga/broker-service/blob/master/Application/Services/BankStatementService.cs#L544

return await DataContext.BankStatements
                .Where(s => bankStatementIds.Contains(s.RequestId))
                .Include(s => s.Applicant).Include(s => s.Lender)
                .Select(m => new BankStatementModel
                {
                    RequestId = m.RequestId,
                    ApplicantId = m.ApplicantId,
                    ApplicantName = $"{m.Applicant.FirstName} {m.Applicant.LastName}",
                    IsPrimaryApplicant = m.Applicant.PrimaryApplicant,
                    LenderId = m.LenderId,
                    LenderName = m.Lender != null?m.Lender.Name : m.LenderName,
                    LenderLogo = m.Lender.Logo,
                    Deprecated = m.Deprecated,
                    Provider = m.Provider,
                    RequestVersion = m.RequestVersion
                }).ToListAsync();

EF.Function
https://git.itelasoft.com.au/chamith.saranga/broker-service/blob/master/Application/Services/ProductService.cs#L134
           if (!string.IsNullOrWhiteSpace(name))           
                query = query
                    .Where(p => EF.Functions.Like(p.Name, $@"%{name}%"));          

Monday, February 8, 2021

.Net Core Utilities

 Audit Filter 

 public class AuditFilter : IAsyncActionFilter
    {
        /// <summary>
        /// The Logger
        /// </summary>
        private readonly ILogger<AuditFilter> logger;


        /// <summary>
        /// Constructs an Audit Filter
        /// </summary>
        /// <param name="logger"></param>
        public AuditFilter(ILogger<AuditFilter> logger)
        {
            this.logger = logger;
        }


        /// <summary>
        /// This method is called just before an action is invoked
        /// </summary>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            LogRequest(context);
            await next();
        }


        /// <summary>
        /// Logs the request information about the request 
        /// </summary>
        /// <param name="context">The Action Executing Context</param>
        private void LogRequest(ActionExecutingContext context)
        {
            Dictionary<string, object> routeData = null;

            if (context.HttpContext.Request.ContentType == null
                || !context.HttpContext.Request.ContentType.Contains("multipart/form-data"))
                routeData = context.ActionArguments?.ToDictionary(kv => kv.Key, kv => kv.Value);

            var request = new
            {
                RequestId = context.HttpContext.TraceIdentifier, // Request identifier ({ConnectionId:RequestNumber}) generated by Kestrel
                RouteData = routeData, // Route parameters (including anything taken from request body)
                UserId = context.HttpContext.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value, // User Id
                Name = context.HttpContext.User?.FindFirst(ClaimTypes.Name)?.Value, // User Name
                Date = DateTime.UtcNow, // Date and time in UTC
                Operation = $"{context.HttpContext.Request.Path}-{context.HttpContext.Request.Method}", // Endpoint - HTTP verb
            };

            logger.LogInformation(JsonConvert.SerializeObject(request));
        }
    }

CS Events