public static IApplicationBuilder UseBasicAuthentication(this IApplicationBuilder app, IContainerResolve container, BasicAuthenticationContextOption option)
        {
            if (null == app)
            {
                throw new ArgumentNullException(nameof(app));
            }

            if (null == option)
            {
                throw new ArgumentNullException(nameof(option));
            }

            return(app.UseMiddleware <BasicAuthenticationMiddleware>(option));
        }
        public BasicAuthenticationMiddleware(RequestDelegate next, IContainerResolve container, BasicAuthenticationContextOption option)
        {
            _next = next ?? throw new ArgumentNullException(nameof(next));

            if (null == container)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (null == option)
            {
                throw new ArgumentNullException(nameof(option));
            }

            if (null == option.Settings)
            {
                throw new ArgumentNullException("Settings defined in option cannot be null.");
            }

            _logger = container.Resolve <ILogger <BasicAuthenticationMiddleware> >();

            if (!string.IsNullOrEmpty(option.DefaultUpn))
            {
                if (!Regex.IsMatch(option.DefaultUpn, @"^@([a-zA-Z0-9]+\.[a-zA-Z0-9]+)"))
                {
                    _logger.Technical().Warning($"Bad upn format, we expect a @ and one point.").Log();
                    option.DefaultUpn = string.Empty;
                }
                else
                {
                    _logger.Technical().Information($"Default upn: {option.DefaultUpn}.").Log();
                }
            }

            if (option.Settings.Values.ContainsKey(TokenKeys.ProviderIdKey))
            {
                _hasProvider = container.TryResolve(option.Settings.Values[TokenKeys.ProviderIdKey], out _provider);
                if (!_hasProvider)
                {
                    _logger.Technical().Error($"No token provider was found with resolution name equal to: {option.Settings.Values[TokenKeys.ProviderIdKey]}.").Log();
                }
            }
            else
            {
                _logger.Technical().Error($"No token provider resolution name is defined in your settings!").Log();
            }

            if (!_hasProvider)
            {
                _logger.Technical().Error($"Basic Authentication capability is deactivated!").Log();
            }

            if (!container.TryResolve(out _tokenCache))
            {
                _logger.Technical().Error($"No token ache are defined for Basic Authentication.").Log();
            }

            _option    = option;
            _container = container;

            _activitySource = container.Resolve <IActivitySourceFactory>()?.GetArc4u();
        }