public async Task <DetailResponse <SimulatorNetwork> > GetSimulatorNetworkAsync(string id)
        {
            var simNetwork = await _simulatorNetworkManager.GetSimulatorNetworkAsync(id, OrgEntityHeader, UserEntityHeader);

            return(DetailResponse <Models.SimulatorNetwork> .Create(simNetwork));
        }
Пример #2
0
        public async Task <SimulatorNetwork> ValidateRequest()
        {
            var request = HttpContext.Request;

            foreach (var header in request.Headers.Keys)
            {
                Console.WriteLine($"{header}={request.Headers[header.ToLower()]} - {request.Headers.ContainsKey(header)} - {request.Headers.ContainsKey(header.ToLower())}");
            }

            CheckHeader(request, REQUEST_ID);
            CheckHeader(request, ORG_ID);
            CheckHeader(request, ORG);
            CheckHeader(request, NETWORK_ID);
            CheckHeader(request, DATE);
            CheckHeader(request, VERSION);

            var authheader = GetHeaderValue(request, "authorization");

            var requestId = GetHeaderValue(request, REQUEST_ID);
            var dateStamp = GetHeaderValue(request, DATE);
            var orgId     = GetHeaderValue(request, ORG_ID);
            var org       = GetHeaderValue(request, ORG);
            var networkId = GetHeaderValue(request, NETWORK_ID);
            var userId    = GetHeaderValue(request, USER_ID);
            var userName  = GetHeaderValue(request, USER);

            var version = GetHeaderValue(request, VERSION);

            var bldr = new StringBuilder();

            //Adding the \r\n manualy ensures that the we don't have any
            //platform specific code messing with our signature.
            bldr.Append($"{requestId}\r\n");
            bldr.Append($"{dateStamp}\r\n");
            bldr.Append($"{version}\r\n");
            bldr.Append($"{orgId}\r\n");
            bldr.Append($"{userId}\r\n");
            bldr.Append($"{networkId}\r\n");

            OrgEntityHeader  = EntityHeader.Create(orgId, org);
            UserEntityHeader = EntityHeader.Create(userId, userName);

            var network = await _simNetworkManager.GetSimulatorNetworkAsync(networkId, OrgEntityHeader, UserEntityHeader);

            if (network == null)
            {
                throw new Exception("Could not find simulator for network id [networkId]");
            }

            Console.WriteLine($"Found network {network.Name} - {network.SharedAccessKey1SecretId},{network.SharedAccessKey2SecretId}");
            Console.WriteLine($"Calc {network.Name} - {network.SharedAccessKey1SecretId},{network.SharedAccessKey2SecretId}");

            var key1 = await _secureStorage.GetSecretAsync(OrgEntityHeader, network.SharedAccessKey1SecretId, UserEntityHeader);

            if (!key1.Successful)
            {
                throw new Exception(key1.Errors.First().Message);
            }

            var calculatedFromFirst = GetSignature(requestId, key1.Result, bldr.ToString());

            Console.WriteLine($"Calc {calculatedFromFirst} - {authheader}");

            if (calculatedFromFirst != authheader)
            {
                var key2 = await _secureStorage.GetSecretAsync(OrgEntityHeader, network.SharedAccessKey2SecretId, UserEntityHeader);

                if (!key2.Successful)
                {
                    throw new Exception(key2.Errors.First().Message);
                }

                var calculatedFromSecond = GetSignature(requestId, key2.Result, bldr.ToString());
                if (calculatedFromSecond != authheader)
                {
                    throw new UnauthorizedAccessException("Invalid signature.");
                }
            }

            foreach (var simulator in network.Simulators)
            {
                simulator.Simulator.Value = await _simManager.GetSimulatorAsync(simulator.Simulator.Id, OrgEntityHeader, UserEntityHeader, true);
            }

            return(network);
        }