예제 #1
0
        /// <summary>
        /// Calls <see cref="SwaggerDocsConfig.DescribeAllEnumsAsStrings(bool)"/>
        /// | Make it compatible with owin branching
        /// | Ignores CancellationToken parameter type
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultApiConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            doc.DescribeAllEnumsAsStrings();
            doc.RootUrl(req => new Uri(req.RequestUri, req.GetOwinContext().Request.PathBase.Value).ToString());
            doc.OperationFilter <OpenApiIgnoreParameterTypeOperationFilter <CancellationToken> >();
            doc.OperationFilter <DefaultAuthorizationOperationFilter>();

            AppEnvironment appEnv = DefaultAppEnvironmentProvider.Current.GetActiveAppEnvironment();

            doc.OAuth2("oauth2")
            .Flow("password")
            .TokenUrl($"{appEnv.GetSsoUrl()}/connect/token")
            .Scopes(scopes =>
            {
                if (!appEnv.Security.Scopes.SequenceEqual(new[] { "openid", "profile", "user_info" }))
                {
                    foreach (string scope in appEnv.Security.Scopes)
                    {
                        scopes.Add(scope, scope);
                    }
                }
            });

            return(doc);
        }
예제 #2
0
        public static OAuth2SchemeBuilder AppServiceAuthentication(this SwaggerDocsConfig config, Uri siteUri, string authProvider)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            if (siteUri == null)
            {
                throw new ArgumentNullException("siteUri");
            }

            if (authProvider == null)
            {
                throw new ArgumentNullException("authProvider");
            }

            config.OperationFilter(() => new MobileAppAuthenticationFilter(authProvider));

            Uri loginUri = new Uri(siteUri, new Uri(".auth/login/" + authProvider, UriKind.Relative));

            return(config.OAuth2(authProvider)
                   .Description("OAuth2 Implicit Grant")
                   .Flow("implicit")
                   .AuthorizationUrl(loginUri.ToString()));
        }
        public static SwaggerEnabledConfiguration EnableSwagger(
            this HttpConfiguration httpConfig,
            string routeTemplate,
            Action <SwaggerDocsConfig> configure = null)
        {
            var config = new SwaggerDocsConfig();

            if (configure != null)
            {
                configure(config);
            }

            httpConfig.Routes.MapHttpRoute(
                name: "swagger_docs",
                routeTemplate: routeTemplate,
                defaults: null,
                constraints: new { apiVersion = @".+" },
                handler: new SwaggerDocsHandler(config)
                );

            return(new SwaggerEnabledConfiguration(
                       httpConfig,
                       config.GetRootUrl,
                       config.GetApiVersions().Select(version => routeTemplate.Replace("{apiVersion}", version))));
        }
예제 #4
0
        /// <summary>
        /// Calls <see cref="SwaggerDocsConfig.DescribeAllEnumsAsStrings(bool)"/>
        /// | Make it compatible with owin branching
        /// | Ignores CancellationToken parameter type
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultApiConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            doc.DescribeAllEnumsAsStrings();
            doc.RootUrl(req => new Uri(req.RequestUri, req.GetOwinContext().Request.PathBase.Value).ToString());
            doc.OperationFilter <OpenApiIgnoreParameterTypeOperationFilter <CancellationToken> >();
            AppEnvironment appEnv = (AppEnvironment)webApiConfig.DependencyResolver.GetService(typeof(AppEnvironment));

            doc.OperationFilter(() => new DefaultAuthorizationOperationFilter {
                AppEnvironment = appEnv
            });
            doc.OperationFilter <SwaggerDefaultValuesOperationFilter>();
            doc.OperationFilter <ExamplesOperationFilter>();
            doc.OperationFilter <DescriptionOperationFilter>();
            doc.SchemaId(type => $"{type.FullName}, {type.Assembly.GetName().Name}");

            doc.OAuth2("oauth2")
            .Flow("password")
            .TokenUrl($"{appEnv.GetSsoUrl()}/connect/token")
            .Scopes(scopes =>
            {
                if (!appEnv.Security.Scopes.SequenceEqual(new[] { "openid", "profile", "user_info" }))
                {
                    foreach (string scope in appEnv.Security.Scopes)
                    {
                        scopes.Add(scope, scope);
                    }
                }
            });

            return(doc);
        }
 public AreaSwaggerConfigurationContext(SwaggerDocsConfig config, IEnumerable <string> discoveryPaths, string routeTemplate)
 {
     Config          = config;
     RootUrlResolver = config.GetRootUrl;
     DiscoveryPaths  = discoveryPaths;
     RouteTemplate   = routeTemplate;
 }
예제 #6
0
        /// <summary>
        /// Calls <see cref="SwaggerDocsConfig.DescribeAllEnumsAsStrings(bool)"/>
        /// | Make it compatible with owin branching
        /// | Ignores CancellationToken parameter type
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultApiConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            doc.DescribeAllEnumsAsStrings();
            doc.RootUrl(req => new Uri(req.RequestUri, req.GetOwinContext().Request.PathBase.Value).ToString());
            doc.OperationFilter <OpenApiIgnoreParameterTypeOperationFilter <CancellationToken> >();

            return(doc);
        }
예제 #7
0
 public void Apply(Swashbuckle.Application.SwaggerDocsConfig c)
 {
     c.ApiKey(Key)
     .Name(Name)
     .Description(Description)
     .In(In);
     c.DocumentFilter(() => this);
     c.OperationFilter(() => this);
 }
예제 #8
0
        private readonly List <DiscoveryUrlsObj> _discoveryPathsObj;  //we want the version name and the title

        public SwaggerEnabledConfiguration(HttpConfiguration httpConfig, Func <HttpRequestMessage, string> rootUrlResolver,
                                           IEnumerable <string> discoveryPaths, SwaggerDocsConfig swaggerDocsConfig, string routeTemplate)
        {
            _swaggerDocsConfig = swaggerDocsConfig;
            _httpConfig        = httpConfig;
            _rootUrlResolver   = rootUrlResolver;
            _discoveryPaths    = discoveryPaths;

            _discoveryPathsObj = swaggerDocsConfig.GetDiscoveryPaths(routeTemplate);
        }
예제 #9
0
        public static OAuth2SchemeBuilder AppServiceAuthentication(this SwaggerDocsConfig config, string siteUri, string authProvider)
        {
            if (siteUri == null)
            {
                throw new ArgumentNullException("siteUri");
            }

            Uri uri = new Uri(siteUri);

            return(AppServiceAuthentication(config, uri, authProvider));
        }
예제 #10
0
        /// <summary>
        /// Calls <see cref="OpenApiExtensions.ApplyDefaultODataConfig(SwaggerDocsConfig, HttpConfiguration)"/>
        /// | Ignores ODataQueryOptions parameter type
        /// | Uses <see cref="ODataSwaggerProvider"/>
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultODataConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            doc.ApplyDefaultApiConfig(webApiConfig);
            doc.OperationFilter <OpenApiIgnoreParameterTypeOperationFilter <ODataQueryOptions> >();
            doc.CustomProvider(defaultProvider => new ODataSwaggerProvider(defaultProvider, doc, webApiConfig).Configure(odataConfig =>
            {
                odataConfig.EnableSwaggerRequestCaching();
                odataConfig.IncludeNavigationProperties();
                odataConfig.SetAssembliesResolver((System.Web.Http.Dispatcher.IAssembliesResolver)webApiConfig.DependencyResolver.GetService(typeof(System.Web.Http.Dispatcher.IAssembliesResolver)));
            }));

            return(doc);
        }
예제 #11
0
        /// <summary>
        /// Calls <see cref="OpenApiExtensions.ApplyDefaultODataConfig(SwaggerDocsConfig, HttpConfiguration)"/>
        /// | Ignores ODataQueryOptions parameter type
        /// | Uses <see cref="ODataSwaggerProvider"/>
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultODataConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            doc.ApplyDefaultApiConfig(webApiConfig);
            doc.OperationFilter <OpenApiIgnoreParameterTypeOperationFilter <ODataQueryOptions> >();
            doc.CustomProvider(defaultProvider => new ODataSwaggerProvider(defaultProvider, doc, webApiConfig).Configure(odataConfig =>
            {
                odataConfig.EnableSwaggerRequestCaching();
                odataConfig.IncludeNavigationProperties();
                odataConfig.SetAssembliesResolver((System.Web.Http.Dispatcher.IAssembliesResolver)webApiConfig.DependencyResolver.GetService(typeof(System.Web.Http.Dispatcher.IAssembliesResolver)));
            }));

            doc.SchemaId(type => type.AssemblyQualifiedName);
            doc.GroupActionsBy(apiDesc => $"[{((ODataRoute)apiDesc.Route).RoutePrefix}] {apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName}");

            return(doc);
        }
예제 #12
0
        public static SwaggerEnabledConfiguration EnableSwagger(
            this HttpConfiguration httpConfig,
            string routeTemplate,
            Action <SwaggerDocsConfig> configure = null)
        {
            SwaggerDocsConfig config = new SwaggerDocsConfig();

            if (configure != null)
            {
                configure(config);
            }
            HttpRouteCollectionExtensions.MapHttpRoute(httpConfig.get_Routes(), "swagger_docs" + routeTemplate, routeTemplate, (object)null, (object)new
            {
                apiVersion = ".+"
            }, (HttpMessageHandler) new SwaggerDocsHandler(config));
            return(new SwaggerEnabledConfiguration(httpConfig, new Func <HttpRequestMessage, string>(config.GetRootUrl), config.GetApiVersions().Select <string, string>((Func <string, string>)(version => routeTemplate.Replace("{apiVersion}", version)))));
        }
        public static IDictionary <AreaDescription, AreaSwaggerConfigurationContext> DiscoverAreas(Assembly assembly,
                                                                                                   Action <SwaggerDocsConfig, AreaDescription> configure = null, string routeAreaTemplate = null)
        {
            var areasDiscoveryPaths = new Dictionary <AreaDescription, AreaSwaggerConfigurationContext>();

            foreach (var type in assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AreaRegistration))))
            {
                var config           = new SwaggerDocsConfig();
                var areaRegistration = (AreaRegistration)Activator.CreateInstance(type);
                var area             = new AreaDescription(areaRegistration.AreaName, type);

                configure?.Invoke(config, area);

                var routeTemplate  = (routeAreaTemplate ?? DefaultRouteTemplate).Replace("{areaName}", areaRegistration.AreaName.ToLowerInvariant());
                var discoveryPaths = config.GetApiVersions().Select(version => routeTemplate.Replace("{apiVersion}", version));

                areasDiscoveryPaths.Add(area, new AreaSwaggerConfigurationContext(config, discoveryPaths, routeTemplate));
            }

            return(areasDiscoveryPaths);
        }
        private static AreaSwaggerConfigurationContext EnableSwaggerOutOfAreas(HttpConfiguration httpConfig, Action <SwaggerDocsConfig, AreaDescription> configure,
                                                                               string routeAreaTemplate, IList <AreaDescription> allAreas)
        {
            var config = new SwaggerDocsConfig();

            configure?.Invoke(config, AreaDescription.Empty);

            var routeTemplate = (routeAreaTemplate ?? DefaultRouteTemplate)
                                .Replace("{areaName}/", string.Empty);

            httpConfig.Routes.MapHttpRoute(
                name: "swagger_docs" + routeTemplate,
                routeTemplate: routeTemplate,
                defaults: null,
                constraints: new { apiVersion = @".+" },
                handler: new SwaggerDocsHandler(config, null, allAreas)
                );

            var discoveryPaths = config.GetApiVersions().Select(version => routeTemplate.Replace("{apiVersion}", version));

            return(new AreaSwaggerConfigurationContext(config, discoveryPaths, routeTemplate));
        }
예제 #15
0
        /// <summary>
        /// Calls <see cref="OpenApiExtensions.ApplyDefaultODataConfig(SwaggerDocsConfig, HttpConfiguration)"/>
        /// | Ignores ODataQueryOptions parameter type
        /// | Uses <see cref="ODataSwaggerProvider"/>
        /// </summary>
        public static SwaggerDocsConfig ApplyDefaultODataConfig(this SwaggerDocsConfig doc, HttpConfiguration webApiConfig)
        {
            if (doc == null)
                throw new ArgumentNullException(nameof(doc));

            if (webApiConfig == null)
                throw new ArgumentNullException(nameof(webApiConfig));

            doc.DocumentFilter<RemoveDefaultODataNamespaceFromSwaggerDocumentFilter>();
            doc.ApplyDefaultApiConfig(webApiConfig);
            doc.OperationFilter<OpenApiIgnoreParameterTypeOperationFilter<ODataQueryOptions>>();
            doc.CustomProvider(defaultProvider => new ODataSwaggerProvider(defaultProvider, doc, webApiConfig).Configure(odataConfig =>
            {
                odataConfig.EnableSwaggerRequestCaching();
                odataConfig.IncludeNavigationProperties();
                odataConfig.SetAssembliesResolver((System.Web.Http.Dispatcher.IAssembliesResolver)webApiConfig.DependencyResolver.GetService(typeof(System.Web.Http.Dispatcher.IAssembliesResolver)));
            }));

            doc.GroupActionsBy(apiDesc => $"[{((ODataRoute)apiDesc.Route).RoutePrefix}] {apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName}");

            return doc;
        }
예제 #16
0
        public static SwaggerDocsConfig VersioningSwaggerDoc(this SwaggerDocsConfig config,
                                                             VersionedApiExplorer apiExplorer, string docTitleFormat, string versionParamName)
        {
            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }

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

            if (string.IsNullOrWhiteSpace(docTitleFormat))
            {
                throw new ArgumentNullException(nameof(docTitleFormat));
            }

            if (string.IsNullOrWhiteSpace(versionParamName))
            {
                throw new ArgumentNullException(nameof(versionParamName));
            }

            config.MultipleApiVersions(
                (apiDescription, version) => apiDescription.GetGroupName() == version,
                info =>
            {
                foreach (var group in apiExplorer.ApiDescriptions)
                {
                    info.Version(group.Name, string.Format(docTitleFormat, group.ApiVersion));
                }
            });

            config.OperationFilter(() => new RemoveVersionParameters(versionParamName));
            config.DocumentFilter(() => new SetVersionInPaths(versionParamName));

            return(config);
        }
예제 #17
0
 public static SwaggerDocsConfig VersioningSwaggerDoc(this SwaggerDocsConfig config,
                                                      VersionedApiExplorer apiExplorer, string docTitleFormat)
 {
     return(VersioningSwaggerDoc(config, apiExplorer, docTitleFormat, "api-version"));
 }
예제 #18
0
 public static SwaggerDocsConfig VersioningSwaggerDoc(this SwaggerDocsConfig config,
                                                      VersionedApiExplorer apiExplorer)
 {
     return(VersioningSwaggerDoc(config, apiExplorer, "API {0}"));
 }
 public SwaggerDocsHandler(SwaggerDocsConfig config)
 {
     _config = config;
 }
 public SwaggerDocsHandler(SwaggerDocsConfig config)
 {
     _config         = config;
     IsAuthenticated = CheckThreadAuthentication;
     stopWatch       = new Stopwatch();
 }
예제 #21
0
 public static string DefaultRootUrlResolver(HttpRequestMessage request)
 {
     return(new UriBuilder(SwaggerDocsConfig.GetHeaderValue(request, "X-Forwarded-Proto") ?? request.RequestUri.Scheme, SwaggerDocsConfig.GetHeaderValue(request, "X-Forwarded-Host") ?? request.RequestUri.Host, int.Parse(SwaggerDocsConfig.GetHeaderValue(request, "X-Forwarded-Port") ?? request.RequestUri.Port.ToString((IFormatProvider)CultureInfo.InvariantCulture)), (SwaggerDocsConfig.GetHeaderValue(request, "X-Forwarded-Prefix") ?? string.Empty) + HttpRequestMessageExtensions.GetConfiguration(request).get_VirtualPathRoot()).Uri.AbsoluteUri.TrimEnd('/'));
 }
예제 #22
0
 public SwaggerDocsHandler(SwaggerDocsConfig config, AreaDescription area = null, IList <AreaDescription> allAreas = null)
 {
     _config   = config;
     _area     = area;
     _allAreas = allAreas ?? new List <AreaDescription>();
 }