static void ImportToIdentityServer(MicroserviceOptions MSOptions)
        {
            if (MSOptions.IdentityServerUri == null)
            {
                return;
            }

            var url = $"{MSOptions.IdentityServerUri.OriginalString}/api/ApiResource/Import";

            using (var hc = new HttpClient())
            {
                var content = new StringContent(JsonConvert.SerializeObject(new
                {
                    MSOptions.MicroServiceName,

                    MSOptions.MicroServiceDisplayName,

                    MSOptions.MicroServiceDescription,

                    MSOptions.MicroServiceClientIDs,

                    MSOptions.MicroServiceRedirectUrls,

                    MicroServicePolicies = MicroserviceExtensions.EntryAssemblyPolicies()
                }), Encoding.UTF8, "application/json");

                try
                {
                    var response = hc.PostAsync(url, content).Result;
                }
                catch {
                }
            }
        }
Esempio n. 2
0
 public Startup(IConfiguration configuration)
 {
     Configuration        = configuration;
     _microserviceOptions = new MicroserviceOptions <ApiMicroserviceOptions>()
     {
         ServiceId = "web-1",
     };
     _microservice = new ApiMicroservice(_microserviceOptions);
 }
Esempio n. 3
0
        public static void UseMicroservice(this IApplicationBuilder app, IHostingEnvironment env,
                                           MicroserviceOptions microserviceOptions)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();
            CultureInfo[] supportedCultures = new[]
            {
                "de-DE",
                "en-US"
            }.Select(code => new CultureInfo(code)).ToArray();
            app.UseRequestLocalization(new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en-US"),
                // Formatting numbers, dates, etc.
                SupportedCultures = supportedCultures,
                // UI strings that we have localized.
                SupportedUICultures = supportedCultures
            });
            app.UseCors(options => options
                        .AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .WithExposedHeaders("X-Authentication-Hash")
                        .AllowCredentials());
            app.UseResponseCompression();
            JsonExceptionMiddleware jsonExceptionMiddleware =
                new JsonExceptionMiddleware(app.ApplicationServices.GetRequiredService <IHostingEnvironment>());

            app.UseExceptionHandler(new ExceptionHandlerOptions {
                ExceptionHandler = jsonExceptionMiddleware.Invoke
            });
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/1.0/swagger.json", microserviceOptions.Swagger.Title);
                options.DocExpansion(DocExpansion.List);
            });

            app.Use(async(context, next) =>
            {
                CurrentUserProvider currentUserProvider = app.ApplicationServices.GetService <CurrentUserProvider>();

                if (currentUserProvider != null)
                {
                    context.Response.Headers.Add("X-Authentication-Hash", currentUserProvider.User.Name.ToSha256());
                }

                await next();
            });
            app.UseMvcWithDefaultRoute();
        }
Esempio n. 4
0
        /// <summary>
        /// Creates a builder.
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="configuration">The config.</param>
        /// <returns></returns>
        public static IMicroserviceBuilder AddMicroService(
            this IServiceCollection services,
            IConfiguration configuration,
            Action <MicroserviceOptions> msOptions = null)
        {
            var Options = new MicroserviceOptions();

            if (msOptions != null)
            {
                msOptions.Invoke(Options);
            }

            var MSConfig = configuration.GetSection("MicroService").Get <MicroserviceConfig>();

            #region MicroServiceName
            if (string.IsNullOrWhiteSpace(Options.MicroServiceName))
            {
                Options.MicroServiceName = MSConfig.Name;

                if (string.IsNullOrWhiteSpace(Options.MicroServiceName))
                {
                    Options.MicroServiceName = AppConstant.AssemblyName.ToLower();

                    throw new Exception("Not config MicroServiceName");
                }
            }
            #endregion

            #region MicroServiceDisplayName
            if (string.IsNullOrWhiteSpace(Options.MicroServiceDisplayName))
            {
                Options.MicroServiceDisplayName = MSConfig.DisplayName;

                if (string.IsNullOrWhiteSpace(Options.MicroServiceDisplayName))
                {
                    Options.MicroServiceDisplayName = Options.MicroServiceName;
                }
            }
            #endregion

            #region MicroServiceDescription
            if (string.IsNullOrWhiteSpace(Options.MicroServiceDescription))
            {
                Options.MicroServiceDescription = MSConfig.Description;

                if (string.IsNullOrWhiteSpace(Options.MicroServiceDescription))
                {
                    Options.MicroServiceDescription = Options.MicroServiceName;
                }
            }
            #endregion

            #region MicroServiceClientIDs
            if (Options.MicroServiceClientIDs.Count < 1)
            {
                Options.MicroServiceClientIDs = MSConfig.ClientIDs;

                if (Options.MicroServiceClientIDs.Count < 1)
                {
                    Options.MicroServiceClientIDs = new List <string>()
                    {
                        "swagger"
                    };
                }
            }
            #endregion

            #region MicroServiceRedirectUrls
            if (Options.MicroServiceRedirectUrls.Count < 1)
            {
                Options.MicroServiceRedirectUrls = MSConfig.RedirectUrls;

                if (Options.MicroServiceRedirectUrls.Count < 1)
                {
                    throw new Exception("please config MicroService:RedirectUrls in appsettings.json");
                }
            }
            #endregion

            var builder = new MicroserviceBuilder(services);

            builder.Services.AddSingleton(Options);

            #region Cors
            if (Options.EnableCors)
            {
                builder.Services.AddCors(options =>
                {
                    options.AddPolicy("cors-allowanonymous", x =>
                    {
                        x.AllowAnyHeader();
                        x.AllowAnyMethod();
                        x.AllowAnyOrigin();
                        x.AllowCredentials();
                    });
                });
            }
            #endregion

            #region WebEncoders
            if (Options.EnableWebEncoders)
            {
                services.AddWebEncoders(opt =>
                {
                    opt.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
                });
            }
            #endregion

            #region AuthorizationPolicy
            if (Options.EnableAuthorizationPolicy)
            {
                builder.Services.AddAuthorization(options =>
                {
                    var entry_policies = EntryAssemblyPolicies();

                    foreach (var policyConfig in entry_policies)
                    {
                        #region Client的权限策略
                        policyConfig.Scopes.ForEach(x =>
                        {
                            var policyName = $"{PolicyKey.ClientScope}:{x}";

                            var policyValues = new List <string>()
                            {
                                $"{Options.MicroServiceName}.{x}",
                                $"{Options.MicroServiceName}.{policyConfig.ControllerName}.all",
                                $"{Options.MicroServiceName}.all"
                            };

                            options.AddPolicy(policyName,
                                              policy => policy.RequireClaim(PolicyKey.ClientScope, policyValues));
                        });
                        #endregion

                        #region User的权限策略
                        policyConfig.Permissions.ForEach(x =>
                        {
                            var policyName = $"{PolicyKey.UserPermission}:{x}";

                            var policyValues = new List <string>()
                            {
                                $"{Options.MicroServiceName}.{x}",
                                $"{Options.MicroServiceName}.{policyConfig.ControllerName}.all",
                                $"{Options.MicroServiceName}.all"
                            };

                            options.AddPolicy(policyName,
                                              policy => policy.RequireAssertion(handler =>
                            {
                                var claim = handler.User.Claims
                                            .FirstOrDefault(c => c.Type.Equals(PolicyKey.UserPermission));

                                if (claim != null && !string.IsNullOrWhiteSpace(claim.Value))
                                {
                                    var claimValues = claim.Value.ToLower().Split(new string[] { "," },
                                                                                  StringSplitOptions.RemoveEmptyEntries);

                                    if (claimValues != null && claimValues.Length > 0)
                                    {
                                        foreach (var item in claimValues)
                                        {
                                            if (policyValues.Contains(item))
                                            {
                                                return(true);
                                            }
                                        }
                                    }
                                }
                                return(false);
                            }));
                        });
                        #endregion
                    }
                });
            }
            #endregion

            #region SwaggerGen
            if (Options.EnableSwaggerGen)
            {
                services.AddSwaggerGen(c =>
                {
                    c.EnableAnnotations();

                    //c.TagActionsBy(x => x.RelativePath.Split('/')[0]);

                    c.AddSecurityDefinition("SubscriptionKey",
                                            new ApiKeyScheme()
                    {
                        Name        = "Ocp-Apim-Subscription-Key",
                        Type        = "apiKey",
                        In          = "header",
                        Description = "从开放平台申请的Subscription Key,从网关调用接口时必需传入。",
                    });

                    c.AddSecurityDefinition("AccessToken",
                                            new ApiKeyScheme()
                    {
                        Name        = "Authorization",
                        Type        = "apiKey",
                        In          = "header",
                        Description = "从身份认证中心颁发的Token,根据接口要求决定是否传入。",
                    });

                    if (Options.IdentityServerUri != null)
                    {
                        c.AddSecurityDefinition("OAuth2",
                                                new OAuth2Scheme()
                        {
                            Type             = "oauth2",
                            Flow             = "accessCode",
                            AuthorizationUrl = Options.IdentityServerUri.OriginalString + "/connect/authorize",
                            TokenUrl         = Options.IdentityServerUri.OriginalString + "/connect/token",
                            Description      = "勾选授权范围,获取Token",
                            Scopes           = new Dictionary <string, string>()
                            {
                                { "openid", "用户标识" },
                                { "profile", "用户资料" },
                                { Options.MicroServiceName + ".all", "所有接口权限" },
                            }
                        });
                    }

                    var provider = services.BuildServiceProvider()
                                   .GetRequiredService <IApiVersionDescriptionProvider>();

                    foreach (var description in provider.ApiVersionDescriptions)
                    {
                        c.SwaggerDoc(description.GroupName, new Info
                        {
                            Title   = AppConstant.AssemblyName,
                            Version = description.ApiVersion.ToString(),
                            License = new License()
                            {
                                Name = "MIT",
                                Url  = "https://spdx.org/licenses/MIT.html"
                            },
                            // Contact = new Contact()
                            // {
                            //     Url = "",
                            //     Name = "",
                            //     Email = ""
                            // },
                            // Description = "Swagger document",
                        });

                        c.CustomSchemaIds(x => x.FullName);
                    }

                    var SiteSwaggerFilePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath,
                                                           AppConstant.AssemblyName + ".xml");

                    if (File.Exists(SiteSwaggerFilePath))
                    {
                        c.IncludeXmlComments(SiteSwaggerFilePath);
                    }
                });
            }
            #endregion

            #region Localization
            if (Options.EnableLocalization)
            {
                builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

                services.Configure <RequestLocalizationOptions>(options =>
                {
                    var supportedCultures = new[]
                    {
                        new CultureInfo("en-US"),
                        new CultureInfo("zh-CN"),
                    };
                    options.DefaultRequestCulture = new RequestCulture("zh-CN", "zh-CN");
                    options.SupportedCultures     = supportedCultures;
                    options.SupportedUICultures   = supportedCultures;
                });

                builder.Services.AddMvc()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization()
                .AddJsonOptions(o =>
                {
                    o.SerializerSettings.ContractResolver      = new CamelCasePropertyNamesContractResolver();
                    o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                });
            }
            #endregion

            #region ApiVersioning
            if (Options.EnableApiVersioning)
            {
                builder.Services.AddVersionedApiExplorer(o => o.GroupNameFormat = "'v'VVV");

                builder.Services.AddApiVersioning(o =>
                {
                    o.AssumeDefaultVersionWhenUnspecified = true;
                    o.ReportApiVersions = true;
                });
            }
            #endregion

            #region Authentication
            builder.Services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(isAuth =>
            {
                isAuth.Authority            = Options.IdentityServerUri.OriginalString;
                isAuth.ApiName              = Options.MicroServiceName;
                isAuth.RequireHttpsMetadata = true;
            });
            #endregion

            #region ResponseCaching
            if (Options.EnableResponseCaching)
            {
                builder.Services.AddResponseCaching();
            }
            #endregion

            return(builder);
        }
Esempio n. 5
0
 // ReSharper disable once UnusedMember.Global
 public void Configure(IApplicationBuilder app, IHostingEnvironment env, MicroserviceOptions microserviceOptions)
 {
     app.UseMicroservice(env, microserviceOptions);
 }
        public static IServiceProvider AddMicroservice(this IServiceCollection services, IConfiguration configuration,
                                                       MicroserviceOptions microserviceOptions)
        {
            services.AddOptions();
            services.Configure <SendGridOptions>(configuration.GetSection("SendGrid"));
            services.Configure <ApplicationSettings>(configuration.GetSection("Application"));
            services.Configure <DatabaseOptions>(options =>
                                                 options.ConnectionString = microserviceOptions.Database.ConnectionString);
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = microserviceOptions.Authentication.Authority;
                options.Audience  = microserviceOptions.Authentication.Audience;
            });
            services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.Converters.Add(new StringEnumConverter());
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
            })
            .AddControllersAsServices()
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddFluentValidation();
            services.AddLocalization(options => options.ResourcesPath = "Resources");
            services.AddApiVersioning(options =>
            {
                options.ReportApiVersions = true;
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.DefaultApiVersion = new ApiVersion(1, 0);
            });
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc(microserviceOptions.Swagger.Version, new Info
                {
                    Title   = microserviceOptions.Swagger.Title,
                    Version = microserviceOptions.Swagger.Version
                });
                options.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    Description =
                        "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name = "Authorization",
                    In   = "header",
                    Type = "apiKey"
                });
                options.AddSecurityRequirement(new Dictionary <string, IEnumerable <string> >
                {
                    {
                        "Bearer", new string[] { }
                    }
                });
            });
            services.Configure <GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Optimal);
            services.AddCors();
            services.AddResponseCompression(options => { options.EnableForHttps = true; });
            ContainerBuilder builder = new ContainerBuilder();

            builder.RegisterInstance(microserviceOptions)
            .AsSelf()
            .SingleInstance();
            builder.RegisterType <HttpContextAccessor>()
            .As <IHttpContextAccessor>()
            .InstancePerLifetimeScope();
            builder.RegisterType <CurrentUserProvider>()
            .AsSelf()
            .InstancePerLifetimeScope();
            builder.Register(context =>
            {
                CurrentUserProvider provider = context.Resolve <CurrentUserProvider>();
                return(provider.User);
            })
            .AsSelf()
            .InstancePerDependency();
            builder.RegisterType <RazorViewRenderer>()
            .As <IViewRenderer>()
            .InstancePerLifetimeScope();
            builder.Register(context =>
            {
                IOptions <SendGridOptions> options = context.Resolve <IOptions <SendGridOptions> >();
                return(new SendGridClient(options.Value));
            })
            .As <IEmailClient>()
            .InstancePerLifetimeScope();
            builder.RegisterModule(new Mapping(microserviceOptions.DomainAssemblies.Select(Assembly.Load)));
            builder.RegisterModule(new Validation(microserviceOptions.DomainAssemblies.Select(Assembly.Load)));
            builder.Populate(services);
            IContainer container = EventFlowOptions.New
                                   .UseAutofacContainerBuilder(builder)
                                   .ConfigureEntityFramework(EntityFrameworkConfiguration.New)
                                   .ConfigureDomain(microserviceOptions.DomainRegistration)
                                   .CreateContainer();

            return(container.Resolve <IServiceProvider>());
        }