public class Startup
{
public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext<UserContext>(options => { options.UseMySQL(Configuration.GetConnectionString("MysqlUser")); }); //从配置文件中获取ServiceDiscovery services.Configure<ServiceDisvoveryOptions>(Configuration.GetSection("ServiceDiscovery")); //单例注册ConsulClient services.AddSingleton<IConsulClient>(p => new ConsulClient(cfg => { var serviceConfiguration = p.GetRequiredService<IOptions<ServiceDisvoveryOptions>>().Value; if (!string.IsNullOrEmpty(serviceConfiguration.Consul.HttpEndpoint)) { // if not configured, the client will use the default value "127.0.0.1:8500" cfg.Address = new Uri(serviceConfiguration.Consul.HttpEndpoint); } })); services.AddMvc(); //添加授权相关代码 services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect(//配置授权信息相关 "oidc", options => { options.SignInScheme = "Cookies"; options.Authority = "http://localhost:52619";//授权地址 options.RequireHttpsMetadata = false;//ssl证书 options.ResponseType = OpenIdConnectResponseType.CodeIdToken; options.ClientId = "MVC"; options.ClientSecret = "Secret"; options.SaveTokens = true; // options.GetClaimsFromUserInfoEndpoint = true;//发起另外一个请求~52619/content/userInfo 获取userinfo //options.ClaimActions.MapJsonKey("sub", "sub"); //options.ClaimActions.MapJsonKey("preferred_username", "preferred_username"); //options.ClaimActions.MapJsonKey("sub", "sub"); //options.ClaimActions.MapJsonKey("avatar", "avatar"); //options.ClaimActions.MapCustomJson("role", jobject => jobject["role"].ToString()); options.Scope.Add("geteway_api"); options.Scope.Add("openid"); options.Scope.Add("profile"); options.Scope.Add("offline_access"); //options.Scope.Add("email"); } );//添加 } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory LoggerFactory, IApplicationLifetime lifetime, IConsulClient consulClient, IOptions<ServiceDisvoveryOptions> DisvoveryOptions) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); app.UseAuthentication(); lifetime.ApplicationStarted.Register(() => { RegisterService(app, DisvoveryOptions, consulClient); }); lifetime.ApplicationStopped.Register(() => { DeRegisterService(app, DisvoveryOptions, consulClient); }); UserContextSeed.SeedAsync(app, LoggerFactory).Wait(); //InitUserDataBase(app);//初始化数据库脚本再创建数据库之后取消注释 } //注册服务方法 private void RegisterService(IApplicationBuilder app, IOptions<ServiceDisvoveryOptions> serviceOptions, IConsulClient consul) { //从当前启动的url中拿到url var features = app.Properties["server.Features"] as FeatureCollection; var addresses = features.Get<IServerAddressesFeature>() .Addresses .Select(p => new Uri(p)); foreach (var address in addresses) { var serviceId = $"{serviceOptions.Value.ServiceName}_{address.Host}:{address.Port}"; var httpCheck = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(1), Interval = TimeSpan.FromSeconds(30), HTTP = new Uri(address, "HealthCheck").OriginalString }; var registration = new AgentServiceRegistration() { Checks = new[] { httpCheck }, Address = address.Host, ID = serviceId, Name = serviceOptions.Value.ServiceName, Port = address.Port }; consul.Agent.ServiceRegister(registration).GetAwaiter().GetResult(); } } //移除方法 private void DeRegisterService(IApplicationBuilder app, IOptions<ServiceDisvoveryOptions> serviceOptions, IConsulClient consul) { //从当前启动的url中拿到url var features = app.Properties["server.Features"] as FeatureCollection; var addresses = features.Get<IServerAddressesFeature>() .Addresses .Select(p => new Uri(p)); foreach (var address in addresses) { var serviceId = $"{serviceOptions.Value.ServiceName}_{address.Host}:{address.Port}"; consul.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult(); } } }