예제 #1
0
        public static KeyValidationResultLite ToLite(this KeyValidationResult val)
        {
            var result = new KeyValidationResultLite()
            {
                KeyId   = val.KeyId,
                IsValid = val.IsValid,
                InnerValidationResult = val.InnerValidationResult
            };

            return(result);
        }
예제 #2
0
        public async Task <KeyValidationResult> IsValid(string pubKey, string secret)
        {
            var result = new KeyValidationResult();

            if (string.IsNullOrWhiteSpace(pubKey) || string.IsNullOrWhiteSpace(secret))
            {
                result.IsValid = false;
                result.Message = _localizer["Client key or secret cannot be blank"];
            }
            else
            {
                if (_keySecretCache.IsValidOnCache(pubKey, secret, out var keyId))
                {
                    var log = _localizer["Login successful based on Cache for: "] + pubKey;
                    _logger.LogInformation(LogEvents.LoginSuccess, log);

                    result.KeyId   = keyId;
                    result.IsValid = true;
                }
                else
                {
                    var key = await _keyManager.GetByPublicKey(pubKey);

                    if (key == null || key.IsDisabled ||
                        !(key.GetSecret1() == secret ||
                          key.GetSecret2() == secret ||
                          key.GetSecret3() == secret))
                    {
                        result.IsValid = false;
                        result.Message = _localizer["Key and/or secret is not valid"];
                    }
                    else
                    {
                        var log = _localizer["Login successful for: "] + pubKey;
                        _logger.LogInformation(LogEvents.LoginSuccess, log);

                        result.KeyId   = key.Id;
                        result.IsValid = true;

                        // Store in cache
                        await _keySecretCache.StoreValidationResultCache(pubKey, key.Id, secret);
                    }
                }
            }

            return(result);
        }
예제 #3
0
        public async Task <KeyValidationResult> IsClientApiKeyValidAsync(string apiKey, string apiSecret,
                                                                         string serviceName, string apiName, string httpAction)
        {
            var validationResult = new KeyValidationResult();

            try
            {
                var url = _settings.AuthApiEndPoint;

                if (!url.EndsWith("/", StringComparison.Ordinal))
                {
                    url += "/";
                }

                url += $"{serviceName}?api={apiName}&httpMethod={httpAction}";

                var request = new HttpRequestMessage(HttpMethod.Get, url);
                request.Headers.Add(ApiHttpHeaders.ApiKey, apiKey);
                request.Headers.Add(ApiHttpHeaders.ApiSecret, apiSecret);

                var client   = _clientFactory.CreateClient();
                var response = await client.SendAsync(request);

                var content = await response.Content.ReadAsStringAsync();

                validationResult = JsonConvert.DeserializeObject <KeyValidationResult>(content);

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    validationResult.IsValid  = false;
                    validationResult.Message += Environment.NewLine + " Unexpected status code: " +
                                                response.StatusCode;
                }
            }
            catch (Exception ex)
            {
                validationResult.IsValid = false;
                validationResult.Message = ex.Message;
            }

            return(validationResult);
        }
예제 #4
0
        public async Task <KeyValidationResult> IsValid(KeyChallenge keyChallenge, string httpMethod, string serviceName, string apiNameOrUrl)
        {
            // Validate client key
            var clientKeyResult = await IsKeyValid(keyChallenge);

            var publicKey = keyChallenge.Properties[ApiKeyPropertyNames.PublicKey];

            if (!clientKeyResult.IsValid)
            {
                // Client key validation failed
                return(new KeyValidationResult
                {
                    InnerValidationResult = clientKeyResult,
                    IsValid = false,
                    Message = _localizer["Client key validation failed"]
                });
            }

            // Key validation passed. Now check if client has the right permission to access the api/url

            var result = new KeyValidationResult();

            ServiceModel service = null;

            if (serviceName.ToLower() == AppConstants.SysApiServiceName.ToLower())
            {
                // Its a core service (eg. manage key, service, role, etc. All active clients can use this service)
                service = await _serviceManager.GetSysService();
            }
            else
            {
                service = await _serviceManager.GetByName(publicKey, serviceName);
            }

            if (service == null)
            {
                result.Message = _localizer["Service not found. Service name or api key is invalid."];
                result.IsValid = false;
                return(result);
            }

            ApiModel api;

            if (serviceName.ToLower() == AppConstants.SysApiServiceName.ToLower())
            {
                // System API
                api = await _apiManager.GetByApiName(service.Id, httpMethod, apiNameOrUrl);
            }
            else
            {
                // User API
                api = await _apiManager.GetByApiName(publicKey, service.Id, httpMethod, apiNameOrUrl);
            }

            if (api == null && !string.IsNullOrEmpty(apiNameOrUrl))
            {
                api = await _apiManager.GetByApiUrl(publicKey, service.Id, httpMethod, apiNameOrUrl);
            }

            if (api == null)
            {
                api = await _apiManager.GetByApiName(publicKey, service.Id, httpMethod, string.Empty);
            }

            if (api == null)
            {
                result.Message = _localizer["Api not found"];
                result.IsValid = false;
                return(result);
            }

            var clientKeyWithRoles = await _keyManager.GetByPublicKey(publicKey);

            foreach (var role in api.Roles)
            {
                result.IsValid = clientKeyWithRoles.Roles.SingleOrDefault(x => x.Id == role.Id && !role.IsDisabled) != null;
                if (result.IsValid)
                {
                    break;
                }
            }

            if (result.IsValid == false)
            {
                result.Message = _localizer["Access denied."];
            }


            result.ApiId     = api.Id;
            result.KeyId     = clientKeyResult.KeyId;
            result.ServiceId = api.ServiceId;

            return(result);
        }