/// <summary> /// /// </summary> /// <param name="request"></param> /// <returns></returns> private bool CheckBasicAuthen(HttpRequest request) { try { var ignores = new[] { "WeatherForecast" }; var keys = new[] { "75836f6ded2047c4b1f5770c3229fc02", // key for front-end "a2660f0f7e3b44cb8a08bf79ac7e94ae", "26dee8c166394501810905fee8a992ba", "e44be7e772364f048523508bbcf08cc3", "098fb55748ad4e4aacc64ea16a07998c", "35d4baf7ea9843a99870eaaac90382ad", "a9030ad3fb5943dd90392480f451e18e", "f936792f71344a6eabf773f18e2694e4", "09411a3942454ec9b36e3bcaf1d69f22" // Da dung }; if (ignores.Any(x => request.Path.Value.ToLower().Contains(x.ToLower()))) { return(true); } long timestampReq = long.Parse(request.Headers["timestamp"]); string keyReq = request.Headers["partner_code"]; string checksumReq = request.Headers["hash"]; // A kiểm tra lời gọi api có phải xuất phát từ B (đã đăng ký liên kết từ trước) hay không if (!keys.Any(x => x.Equals(keyReq))) { return(false); } // A kiểm tra xem lời gọi này là mới hay là thông tin cũ đã quá hạn long timestamp = ((DateTimeOffset)DateTime.UtcNow.AddMinutes(-5)).ToUnixTimeSeconds(); if (timestamp > timestampReq) { return(false); } // Không checksum với method GET if (request.Method.Equals("POST") || request.Method.Equals("PUT")) { // A kiểm tra xem gói tin B gửi qua là gói tin nguyên bản hay gói tin đã bị chỉnh sửa var task = Task.Run(() => ReadRequestBody(request)).GetAwaiter(); string body = task.GetResult(); if (!Encrypting.MD5Verify(string.Concat(body, keyReq, timestampReq), checksumReq)) { return(false); } } else { // A kiểm tra xem gói tin B gửi qua là gói tin nguyên bản hay gói tin đã bị chỉnh sửa string body = ""; if (!Encrypting.MD5Verify(string.Concat(body, keyReq, timestampReq), checksumReq)) { return(false); } } } catch (Exception ex) { return(false); } return(true); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <returns></returns> private Tuple <int, string> CheckBasicAuthenForPartner(HttpRequest request) { StringBuilder log = new StringBuilder(); Tuple <int, string> result = new Tuple <int, string>(1, "success"); try { try { log.AppendLine(request.Path.Value); log.AppendLine(JsonConvert.SerializeObject(request.Headers)); var task = Task.Run(() => ReadRequestBody(request)).GetAwaiter(); log.AppendLine(task.GetResult()); } catch (Exception) { log.AppendLine("null body"); } var keys = new[] { "f936792f71344a6eabf773f18e2694e4", "99793bb9137042a3a7f15950f1215950",// khuê "bkt.partner" }; long timestampReq = long.Parse(request.Query["timestamp"].ToString()); string keyReq = request.Query["partner_code"].ToString(); string checksumReq = request.Query["hash"].ToString(); // A kiểm tra lời gọi api có phải xuất phát từ B (đã đăng ký liên kết từ trước) hay không if (!keys.Any(x => x.Equals(keyReq))) { return(new Tuple <int, string>(400, "partner_code invalid")); } // A kiểm tra xem lời gọi này là mới hay là thông tin cũ đã quá hạn long timestamp = ((DateTimeOffset)DateTime.UtcNow.AddMinutes(-180)).ToUnixTimeSeconds(); if (timestamp > timestampReq) { return(new Tuple <int, string>(400, "timestamp expired")); } // Check toàn vẹn dữ liệu if (request.Method.Equals("POST")) { if (request.Path.Value.ToLower().Contains("api/transactions/receive_external".ToLower())) { var infoPartner = _linkingBank.GetLinkingBankById(new Models.Filters.LinkingBankFilter() { Code = keyReq }); if (infoPartner == null) { return(new Tuple <int, string>(500, "internal server error")); } var task = Task.Run(() => ReadRequestBody(request)).GetAwaiter(); var temp = task.GetResult(); var obj = JsonConvert.DeserializeObject <TransferMoneyRequest>(temp); string secretKey = infoPartner.SecretKey; string input = $"{keyReq}|{timestampReq}|{obj.from_account_number}|{obj.to_account_number}|{(int)obj.amount}|{obj.message}"; if (!Encrypting.HMD5Verify(input, checksumReq, secretKey)) { log.Append("Hash: false"); return(new Tuple <int, string>(400, "hash invalid")); } // Nếu là controller partners thì check thêm mã hóa bất đối xứng string encrypt = request.Query["signature"].ToString(); if (!string.IsNullOrWhiteSpace(encrypt)) { string hash = Encrypting.HMD5Hash(input, secretKey); _encrypt.SetKey(keyReq); if (_encrypt.DecryptData(encrypt, hash)) { return(result); } else { log.Append("DecryptData: false"); return(new Tuple <int, string>(400, "signature invalid")); } } else { log.Append("DecryptData: false"); return(new Tuple <int, string>(400, "signature invalid")); } } else if (request.Path.Value.ToLower().Contains("api/transactions/query_info".ToLower())) { var infoPartner = _linkingBank.GetLinkingBankById(new Models.Filters.LinkingBankFilter() { Code = keyReq }); if (infoPartner == null) { return(new Tuple <int, string>(500, "internal server error")); } var task = Task.Run(() => ReadRequestBody(request)).GetAwaiter(); var temp = task.GetResult(); var obj = JsonConvert.DeserializeObject <InfoUserRequest>(temp); string secretKey = infoPartner.SecretKey; string hash = $"{keyReq}|{timestampReq}|{obj.account_number}"; if (!Encrypting.HMD5Verify(hash, checksumReq, secretKey)) { log.Append("Hash: false"); return(new Tuple <int, string>(400, "hash invalid")); } } else { return(new Tuple <int, string>(400, "invalid url")); } } } catch (Exception ex) { log.Append(ex.Message); return(new Tuple <int, string>(500, "internal server error")); } finally { LoggingTxt.InsertLog(log.ToString()); } return(result); }