示例#1
0
文件: Upload.cs 项目: kooera/vli
 public Upload(IHtmlGenerator generator, JavaScriptEncoder javaScriptEncoder) : base(generator)
 {
     this.JavaScriptEncoder = javaScriptEncoder;
 }
示例#2
0
        /// <summary>
        /// Creates a JSON objectstring to render the reserved Seats in the view
        /// </summary>
        /// <param name="Room">A Room of type Room.</param>
        /// <param name="Seats">A list of type ReservedSeat.</param>
        /// <returns>A JSON string to the ViewModel</returns>
        public static string JSONSeating(Room Room, List <ReservedSeat> Seats)
        {
            if (Room == null)
            {
                Room = new Room();
            }

            List <ObjRow> ObjRowList = new List <ObjRow>();

            for (var j = 1; j <= Room.Rows; j++)
            {
                List <ObjSeat> objSeatList = new List <ObjSeat>();
                for (var i = 1; i <= (Room.Capacity / Room.Rows); i++)
                {
                    ObjSeat ObjSeat = new ObjSeat {
                        GridSeatNum = i, seatNumber = i, SeatStatus = "0"
                    };
                    var seatTaken = 0;
                    Seats.ForEach(s =>
                    {
                        if (s.SeatId == i & s.RowId == j & s.SeatState == SeatState.Reserved)
                        {
                            seatTaken = 1;
                        }
                        if (s.SeatId == i & s.RowId == j & s.SeatState == SeatState.Disabled)
                        {
                            seatTaken = 2;
                        }
                    });
                    if (seatTaken > 0)
                    {
                        ObjSeat.SeatStatus = seatTaken.ToString();
                        seatTaken          = 0;
                    }

                    objSeatList.Add(ObjSeat);
                }
                ObjRow ObjRow = new ObjRow {
                    GridRowId = j, PhyRowId = j.ToString(), objSeat = objSeatList
                };
                ObjRowList.Add(ObjRow);
            }

            ObjArea ObjArea = new ObjArea {
                AreaDesc = "EXECUTIVE", AreaCode = "0000000003", AreaNum = "1", HasCurrentOrder = true, objRow = ObjRowList
            };
            List <ObjArea> ObjAreaList = new List <ObjArea>();

            ObjAreaList.Add(ObjArea);


            ColAreas ColAreas = new ColAreas {
                Count = 1, intMaxSeatId = 21, intMinSeatId = 2, objArea = ObjAreaList
            };
            SeatLayout SeatLayout = new SeatLayout {
                colAreas = ColAreas
            };
            List <object> areaList         = new List <object>();
            List <object> groupedSeatsList = new List <object>();

            Root Root = new Root
            {
                product_id   = 46539040,
                freeSeating  = false,
                tempTransId  = "1ecae165f2d86315fea19963d0ded41a",
                seatLayout   = SeatLayout,
                areas        = areaList,
                groupedSeats = groupedSeatsList
            };

            var encoderSettings = new TextEncoderSettings();

            encoderSettings.AllowCharacters('\u0022');
            encoderSettings.AllowRange(UnicodeRanges.BasicLatin);
            var options = new JsonSerializerOptions
            {
                Encoder       = JavaScriptEncoder.Create(encoderSettings),
                WriteIndented = true
            };
            string jsonString = JsonSerializer.Serialize(Root, options);

            return(jsonString);
        }
 public MockJavaScriptSnippet(TelemetryConfiguration telemetryConfiguration, IOptions <ApplicationInsightsServiceOptions> serviceOptions, IHttpContextAccessor httpContextAccessor, JavaScriptEncoder encoder) : base(telemetryConfiguration, serviceOptions, httpContextAccessor, encoder)
 {
 }
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration      = hostingEnvironment.BuildConfiguration();

            // 请求代理配置
            Configure <ForwardedHeadersOptions>(options =>
            {
                configuration.GetSection("App:Forwarded").Bind(options);
                // 对于生产环境,为安全考虑需要在配置中指定受信任代理服务器
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

            // 配置Ef
            Configure <AbpDbContextOptions>(options =>
            {
                options.UseMySQL();
            });

            // 解决某些不支持类型的序列化
            Configure <AbpJsonOptions>(options =>
            {
                options.UseHybridSerializer = true;
            });
            // 中文序列化的编码问题
            Configure <AbpSystemTextJsonSerializerOptions>(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

            Configure <KestrelServerOptions>(options =>
            {
                options.Limits.MaxRequestBodySize   = null;
                options.Limits.MaxRequestBufferSize = null;
            });

            Configure <AbpBlobStoringOptions>(options =>
            {
                options.Containers.ConfigureAll((containerName, containerConfiguration) =>
                {
                    containerConfiguration.UseFileSystem(fileSystem =>
                    {
                        fileSystem.BasePath = Path.Combine(Directory.GetCurrentDirectory(), "file-blob-storing");
                    });
                });
            });

            // 加解密
            Configure <AbpStringEncryptionOptions>(options =>
            {
                var encryptionConfiguration = configuration.GetSection("Encryption");
                if (encryptionConfiguration.Exists())
                {
                    options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
                    options.DefaultSalt       = encryptionConfiguration.GetSection("Salt").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
                        : options.DefaultSalt;
                    options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
                        : options.InitVectorBytes;
                }
            });

            // 自定义需要处理的异常
            Configure <AbpExceptionHandlingOptions>(options =>
            {
                //  加入需要处理的异常类型
                options.Handlers.Add <Volo.Abp.Data.AbpDbConcurrencyException>();
                options.Handlers.Add <AbpInitializationException>();
                options.Handlers.Add <ObjectDisposedException>();
                options.Handlers.Add <StackOverflowException>();
                options.Handlers.Add <OutOfMemoryException>();
                options.Handlers.Add <System.Data.Common.DbException>();
                options.Handlers.Add <Microsoft.EntityFrameworkCore.DbUpdateException>();
                options.Handlers.Add <System.Data.DBConcurrencyException>();
            });
            // 自定义需要发送邮件通知的异常类型
            Configure <AbpEmailExceptionHandlingOptions>(options =>
            {
                // 是否发送堆栈信息
                options.SendStackTrace = true;
                // 未指定异常接收者的默认接收邮件
                // 指定自己的邮件地址
                // options.DefaultReceiveEmail = "*****@*****.**";
            });

            Configure <AbpDistributedCacheOptions>(options =>
            {
                // 最好统一命名,不然某个缓存变动其他应用服务有例外发生
                options.KeyPrefix = "LINGYUN.Abp.Application";
                // 滑动过期30天
                options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
                // 绝对过期60天
                options.GlobalCacheEntryOptions.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
            });

            Configure <RedisCacheOptions>(options =>
            {
                var redisConfig = ConfigurationOptions.Parse(options.Configuration);
                options.ConfigurationOptions = redisConfig;
                options.InstanceName         = configuration["Redis:InstanceName"];
            });

            Configure <AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded <AppPlatformHttpApiHostModule>("LINGYUN.Platform");
            });

            // 多租户
            Configure <AbpMultiTenancyOptions>(options =>
            {
                options.IsEnabled = true;
            });

            Configure <AbpAuditingOptions>(options =>
            {
                options.ApplicationName = "Platform";
                // 是否启用实体变更记录
                var entitiesChangedConfig = configuration.GetSection("App:TrackingEntitiesChanged");
                if (entitiesChangedConfig.Exists() && entitiesChangedConfig.Get <bool>())
                {
                    options
                    .EntityHistorySelectors
                    .AddAllEntities();
                }
            });

            // Swagger
            context.Services.AddSwaggerGen(
                options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "Platform API", Version = "v1"
                });
                options.DocInclusionPredicate((docName, description) => true);
                options.CustomSchemaIds(type => type.FullName);
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description  = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name         = "Authorization",
                    In           = ParameterLocation.Header,
                    Scheme       = "bearer",
                    Type         = SecuritySchemeType.Http,
                    BearerFormat = "JWT"
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme, Id = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
            });

            // 支持本地化语言类型
            Configure <AbpLocalizationOptions>(options =>
            {
                options.Languages.Add(new LanguageInfo("en", "en", "English"));
                options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
            });

            Configure <AbpClaimsMapOptions>(options =>
            {
                options.Maps.TryAdd("name", () => AbpClaimTypes.UserName);
            });

            context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority            = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.Audience             = configuration["AuthServer:ApiName"];
            });

            if (!hostingEnvironment.IsDevelopment())
            {
                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
                context.Services
                .AddDataProtection()
                .PersistKeysToStackExchangeRedis(redis, "Platform-Protection-Keys");
            }
        }
 public ServerUrlsLinkTagHelper(IHostingEnvironment hostingEnvironment, IMemoryCache cache, HtmlEncoder htmlEncoder, JavaScriptEncoder javaScriptEncoder, IUrlHelperFactory urlHelperFactory) : base(hostingEnvironment, cache, htmlEncoder, javaScriptEncoder, urlHelperFactory)
 {
 }
示例#6
0
        /// <summary>
        /// サービス構成処理。
        /// </summary>
        /// <param name="services"><see cref="IServiceCollection"/></param>
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAutoMapper(typeof(Startup));
            services.Configure <AppSettings>(Configuration.GetSection("AppSettings"));
            services.Configure <EnvSettings>(Configuration.GetSection("EnvSettings"));
            services.Configure <DBSettings>(options =>
            {
                Configuration.GetSection("DBSettings").Bind(options);
                options.SqlProviderFactory = SqlClientFactory.Instance;
            });

            // This is work around. See https://github.com/dotnet/aspnetcore/issues/4853 @zhurinvlad commented on 5 Sep 2018
            services.AddSingleton <IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
            services.AddSingleton <IConfigureOptions <MvcOptions>, MvcConfiguration>();

            services.AddTransient <IAppSettings>(x => x.GetService <IOptionsMonitor <AppSettings> >().CurrentValue);
            services.AddTransient <IEnvSettings>(x => x.GetService <IOptionsMonitor <EnvSettings> >().CurrentValue);
            services.AddTransient <IDBSettings>(x => x.GetService <IOptionsMonitor <DBSettings> >().CurrentValue);
            services.AddTransient <IAccessTokenRepository, AccessTokenRepository>();
            services.AddTransient <IAccountQueryService, AccountQueryService>();
            services.AddTransient <IAccountRepository, AccountRepository>();
            services.AddTransient <IAccountService, AccountService>();
            services.AddTransient <IApplicationRepository, ApplicationRepository>();
            services.AddTransient <IAuthorizationCodeRepository, AuthorizationCodeRepository>();
            services.AddTransient <IAuthorizeService, AuthorizeService>();
            services.AddTransient <IGroupPersonRepository, GroupPersonRepository>();
            services.AddTransient <IGroupQueryService, GroupQueryService>();
            services.AddTransient <IGroupRepository, GroupRepository>();
            services.AddTransient <IGroupService, GroupService>();
            services.AddTransient <IPersonQueryService, PersonQueryService>();
            services.AddTransient <IPersonRepository, PersonRepository>();
            services.AddTransient <IPersonService, PersonService>();
            services.AddTransient <IProjectPersonRepository, ProjectPersonRepository>();
            services.AddTransient <IProjectQueryService, ProjectQueryService>();
            services.AddTransient <IProjectRepository, ProjectRepository>();
            services.AddTransient <IProjectService, ProjectService>();
            services.AddTransient <ITagRepository, TagRepository>();
            services.AddTransient <IWorkTypeQueryService, WorkTypeQueryService>();
            services.AddTransient <IWorkTypeRepository, WorkTypeRepository>();
            services.AddTransient <IWorkTypeService, WorkTypeService>();

            if (!WebHostEnvironment.IsProduction())
            {
                services.AddCors(options =>
                {
                    options.AddDefaultPolicy(builder =>
                    {
                        builder.WithOrigins("https://localhost:8443")
                        .AllowCredentials()
                        .AllowAnyMethod()
                        .AllowAnyHeader();

                        builder.WithOrigins("https://editor.swagger.io")
                        .AllowCredentials()
                        .AllowAnyMethod()
                        .AllowAnyHeader();

                        builder.WithOrigins("https://watertrans.stoplight.io")
                        .AllowCredentials()
                        .AllowAnyMethod()
                        .AllowAnyHeader();
                    });
                });
            }

            services.AddAuthentication(BearerAuthenticationHandler.SchemeName)
            .AddScheme <AuthenticationSchemeOptions, BearerAuthenticationHandler>(BearerAuthenticationHandler.SchemeName, null);

            services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApp(options =>
            {
                Configuration.Bind("AzureAD", options);
                options.Events.OnSignedOutCallbackRedirect = context =>
                {
                    context.Response.Redirect("/");
                    context.HandleResponse();
                    return(Task.CompletedTask);
                };
                options.Events.OnTokenValidated = context =>
                {
                    return(Task.CompletedTask);
                };
            });

            services.AddRazorPages().AddMicrosoftIdentityUI();

            services.AddAuthorization(options =>
            {
                options.AddPolicy(Policies.FullControlScopePolicy, policy =>
                {
                    policy.RequireClaim(Scopes.ClaimType, Scopes.FullControl);
                });
                options.AddPolicy(Policies.ReadScopePolicy, policy =>
                {
                    policy.RequireClaim(Scopes.ClaimType, Scopes.FullControl, Scopes.Read, Scopes.Write, Scopes.User);
                });
                options.AddPolicy(Policies.WriteScopePolicy, policy =>
                {
                    policy.RequireClaim(Scopes.ClaimType, Scopes.FullControl, Scopes.Write);
                });
            });

            services.AddApiVersioning();
            services.AddVersionedApiExplorer(options =>
            {
                options.GroupNameFormat           = "'v'V";
                options.SubstituteApiVersionInUrl = true;
            });
            services.AddControllers(options =>
            {
                options.Filters.Add(typeof(CatchAllExceptionFilter));
            })
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                options.JsonSerializerOptions.IgnoreNullValues = true;
            })
            .ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    return(ErrorObjectResultFactory.ValidationError(context.ModelState));
                };
            })
            .AddDataAnnotationsLocalization(options =>
            {
                options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(ErrorMessages));
            });
            services.AddSwaggerGen(options =>
            {
                options.EnableAnnotations();
                options.SwaggerGeneratorOptions.DescribeAllParametersInCamelCase = true;
                options.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "DailyReport Web Api", Version = "v1"
                });
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "アクセストークンを入力してください。",
                    Name        = "Authorization",
                    In          = ParameterLocation.Header,
                    Type        = SecuritySchemeType.Http,
                    Scheme      = "bearer",
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id   = "Bearer",
                            },
                        },
                        new string[] { }
                    },
                });
            });
        }
示例#7
0
        public override void ConfigureServices(CafConfigurationContext context)
        {
            context.Services.AddControllers().AddJsonOptions(options =>
            {
                //格式化日期时间格式

                options.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
                options.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverterNullable());
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
                //数据格式首字母小写
                options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                //数据格式原样输出
                //options.JsonSerializerOptions.PropertyNamingPolicy = null;
                //取消Unicode编码
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
                //忽略空值
                //options.JsonSerializerOptions.IgnoreNullValues = true;
                //允许额外符号
                options.JsonSerializerOptions.AllowTrailingCommas = true;
                //反序列化过程中属性名称是否使用不区分大小写的比较
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
            }).AddControllersAsServices().AddMvcLocalization();

            context.Services.AddDynamicWebApi();
            #region swagger
            context.Services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Version     = "v1",
                    Title       = "caf API",
                    Description = "API for caf",
                    Contact     = new OpenApiContact()
                    {
                        Name = "Eddy", Email = ""
                    }
                });
                options.DocInclusionPredicate((docName, description) => true);
                var security = new Dictionary <string, IEnumerable <string> >
                {
                    { "Bearer", new string[] { } },
                };
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
                {
                    Description  = "Please enter into field the word 'Bearer' followed by a space and the JWT value",
                    Name         = "Authorization",
                    BearerFormat = "JWT",
                    In           = ParameterLocation.Header,
                    Type         = SecuritySchemeType.ApiKey,
                    Scheme       = "Bearer",
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    { new OpenApiSecurityScheme
                      {
                          Reference = new OpenApiReference()
                          {
                              Id   = "Bearer",
                              Type = ReferenceType.SecurityScheme
                          }
                      }, new string[] {} }
                });
                var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)
                var xmlPath  = Path.Combine(basePath, "caf.WebApi.xml");
                // var xmlPath1 = Path.Combine(basePath, "caf.Application.xml");
                var xmlPath2 = Path.Combine(basePath, "caf.Core.xml");
                //options.IncludeXmlComments(xmlPath);
                // options.IncludeXmlComments(xmlPath1);
                // options.IncludeXmlComments(xmlPath2);
            });
            #endregion
        }
        /// <summary>
        /// コメントを投稿する
        /// </summary>
        /// <exception cref="InvalidPlayerStatusNicoLiveCommentSenderException"></exception>
        /// <exception cref="NetworkNicoLiveCommentSenderException"></exception>
        /// <exception cref="ResponseFormatNicoLiveCommentSenderException"></exception>
        /// <exception cref="ResponseErrorNicoLiveCommentSenderException"></exception>
        public async Task Send(string liveId, string message, string mail)
        {
            string str;

            try
            {
                str = await this.httpClient.GetStringAsync($"http://live.nicovideo.jp/api/getplayerstatus/{liveId}");
            }
            catch (HttpRequestException e)
            {
                throw new NetworkNicoLiveCommentSenderException(e);
            }

            var playerStatus = XDocument.Parse(str).Root;

            liveId = playerStatus.Element("stream")?.Element("id")?.Value;
            string openTime = playerStatus.Element("stream")?.Element("open_time")?.Value;

            if (liveId == null || openTime == null)
            {
                throw new InvalidPlayerStatusNicoLiveCommentSenderException(str);
            }
            // vposは10ミリ秒単位
            long vpos = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 10 - long.Parse(openTime) * 100;

            var options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
            };

            HttpResponseMessage response;

            try
            {
                response = await this.httpClient.PostAsync(
                    $"https://api.cas.nicovideo.jp/v1/services/live/programs/{liveId}/comments",
                    new StringContent(JsonSerializer.Serialize(new Dictionary <string, string> {
                    { "message", message },
                    { "command", mail },
                    { "vpos", vpos.ToString() },
                }, options), Encoding.UTF8, "application/json")
                    );
            }
            catch (HttpRequestException e)
            {
                throw new NetworkNicoLiveCommentSenderException(e);
            }
            string responseBody = await response.Content.ReadAsStringAsync();

            JsonDocument responseBodyJson;

            try
            {
                responseBodyJson = JsonDocument.Parse(responseBody);
            }
            catch (JsonException)
            {
                throw new ResponseFormatNicoLiveCommentSenderException(responseBody);
            }

            using (responseBodyJson)
            {
                int status;
                try
                {
                    status = responseBodyJson.RootElement.GetProperty("meta").GetProperty("status").GetInt32();
                }
                catch (Exception e) when(e is InvalidOperationException || e is KeyNotFoundException)
                {
                    throw new ResponseFormatNicoLiveCommentSenderException(responseBody);
                }
                if (status != 200)
                {
                    throw new ResponseErrorNicoLiveCommentSenderException();
                }
            }
        }
示例#9
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            #region MVC

            //AddControllersWithViews 是mvc项目使用  api可以直接AddControllers
            services.AddControllersWithViews(options =>
            {
                // 异常处理  使用中间件的异常处理吧
                //options.Filters.Add(typeof(HttpGlobalExceptionFilter<Exception>));
            })
            .AddJsonOptions(options =>
            {
                //options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            })
            .ConfigureApiBehaviorOptions(options =>
            {
                //options.SuppressModelStateInvalidFilter = true;
                options.InvalidModelStateResponseFactory = context =>
                {
                    var validationErrors = context.ModelState
                                           .Keys
                                           .SelectMany(k => context.ModelState[k].Errors)
                                           .Select(e => e.ErrorMessage)
                                           .ToArray();
                    var json = BaseResponse.GetBaseResponse(BusinessStatusType.ParameterError, string.Join(",", validationErrors));

                    return(new BadRequestObjectResult(json)
                    {
                        ContentTypes = { "application/problem+json" }
                    });
                };
            });

            services.AddHttpClient();

            services.AddHttpContextAccessor();

            //services.AddCors(options =>
            //{
            //    options.AddPolicy("CorsPolicy",
            //        builder => builder.AllowAnyOrigin()
            //            .WithMethods("GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS")
            //    );
            //});

            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                                  builder => builder.AllowAnyOrigin()
                                  .AllowAnyMethod()
                                  .AllowAnyHeader()
                                  //.WithMethods("GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS")
                                  //如果把下面的也允许就会报错
                                  //.AllowCredentials()
                                  );
            });

            #endregion

            #region Authentication

            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Events = new JwtBearerEvents()
                {
                    OnChallenge = async context =>
                    {
                        //var data = new BaseResponse(BusinessStatusType.Unauthorized);
                        //var result = JsonConvert.SerializeObject(data);
                        var result = " {\"code\":401,\"message\":\"授权失败\",\"data\":null}";
                        //会报StatusCode cannot be set because the response has already started.
                        //context.Response.StatusCode = 401;
                        context.Response.ContentType = "application/json;charset=utf-8";
                        await context.Response.WriteAsync(result);
                    },
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        // If the request is for our hub...
                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) &&
                            (path.StartsWithSegments("/bihuHub")))
                        {
                            // Read the token out of the query string
                            context.Token = accessToken;
                        }
                        return(Task.CompletedTask);
                    }
                };
                options.Authority            = SettingManager.GetValue("Authority");
                options.RequireHttpsMetadata = false;
                options.Audience             = "employee_center";
                //options.TokenValidationParameters.ValidIssuer = "null";
                options.TokenValidationParameters.ValidateIssuer           = false;
                options.TokenValidationParameters.ValidateIssuerSigningKey = false;
                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ClockSkew = TimeSpan.FromMinutes(30)
                };
            });

            #endregion

            #region SignalR

            services.AddSignalR();

            services
            .AddSignalR()
            .AddStackExchangeRedis(SettingManager.GetValue("SignalrStoreConnectionString"), options =>
            {
                options.Configuration.ChannelPrefix = "bihuHub";
            });

            #endregion

            #region DataProtection密钥共享

            //cookies 密钥共享,可以用redis 也可以是同一个xml文件  这里我用redis
            //services.AddSingleton<IXmlRepository, CustomFileXmlRepository>();
            //services.AddDataProtection(configure =>
            //{
            //    configure.ApplicationDiscriminator = "bihuHub";
            //});

            //建立Redis 连接
            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(SettingManager.GetValue("SignalrStoreConnectionString"));
            services.AddSingleton(redis);

            //添加数据保护服务,设置统一应用程序名称,并指定使用Reids存储私钥
            services.AddDataProtection()
            .SetApplicationName(Assembly.GetExecutingAssembly().FullName)
            .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");

            #endregion

            #region Rabbitmq

            services.AddRabbitmq();
            ConfigureRabbitMqClient(services);

            #endregion
        }
示例#10
0
 /// <summary>
 /// 添加服务
 /// </summary>
 /// <param name="serviceCollection"></param>
 public void AddServices(IServiceCollection serviceCollection)
 {
     #region 添加控制器服务
     serviceCollection.AddControllers(mvcOptions =>
     {
         mvcOptions.Filters.Add(new AuthorizeFilter());
         mvcOptions.Filters.Add <ExceptionFilter>();
         mvcOptions.SuppressAsyncSuffixInActionNames = true;
         OnAddControllers?.Invoke(mvcOptions);
     }).AddJsonOptions(jsonOptions =>
     {
         jsonOptions.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All, UnicodeRanges.All);
         jsonOptions.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         jsonOptions.JsonSerializerOptions.PropertyNamingPolicy        = new FirstUpperNamingPolicy();
         OnAddJson?.Invoke(jsonOptions);
     });
     #endregion
     #region 添加响应压缩服务
     if (_config.EnableResponseCompression)
     {
         serviceCollection.AddResponseCompression(responseCompressionOptions =>
         {
             OnAddResponseCompression?.Invoke(responseCompressionOptions);
         });
     }
     #endregion
     #region 添加鉴权服务
     if (_config.EnableAuthentication)
     {
         serviceCollection.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
         .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwtBearerOptions =>
         {
             jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
             {
                 ValidateIssuerSigningKey = true,
                 IssuerSigningKey         = new SymmetricSecurityKey(ApplicationConfig.JWTConfig.KeyBytes),
                 ValidateIssuer           = true,
                 ValidIssuer      = ApplicationConfig.JWTConfig.Issuer,
                 ValidateAudience = true,
                 ValidAudience    = ApplicationConfig.JWTConfig.Audience,
                 ValidateLifetime = true,
                 ClockSkew        = TimeSpan.FromSeconds(ApplicationConfig.JWTConfig.ExpiredTime)
             };
             OnAddJwtBearer?.Invoke(jwtBearerOptions);
         });
     }
     #endregion
     #region 添加Swagger
     if (_config.EnableSwagger)
     {
         /*Swashbuckle.AspNetCore*/
         serviceCollection.AddSwaggerGen(m =>
         {
             m.SwaggerDoc(_config.AppName, new OpenApiInfo
             {
                 Version     = "0.1",
                 Title       = _config.AppName,
                 Description = "提供WebAPI接口",
                 Contact     = new OpenApiContact {
                     Name = "Materal", Email = "*****@*****.**"
                 }
             });
             var bearerScheme = new OpenApiSecurityScheme
             {
                 Description = "在请求头部加入JWT授权。例子:Authorization: Bearer {token}",
                 Name        = "Authorization",
                 In          = ParameterLocation.Header,
                 Type        = SecuritySchemeType.ApiKey,
                 Reference   = new OpenApiReference
                 {
                     Type = ReferenceType.SecurityScheme,
                     Id   = JwtBearerDefaults.AuthenticationScheme
                 }
             };
             m.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, bearerScheme);
             m.AddSecurityRequirement(new OpenApiSecurityRequirement
             {
                 { bearerScheme, new List <string>() }
             });
             if (_config.SwaggerXmlPathArray == null)
             {
                 return;
             }
             foreach (string path in _config.SwaggerXmlPathArray)
             {
                 m.IncludeXmlComments(path);
             }
         });
     }
     #endregion
     #region 添加跨域
     if (_config.EnableCors)
     {
         serviceCollection.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
     }
     #endregion
     OnAddOtherService?.Invoke(serviceCollection);
 }
示例#11
0
 public static JsonSerializerOptions SetDefaults([NotNull] JsonSerializerOptions value, bool?indent = null, bool?propertyNameCaseInsensitive = null, JsonNamingPolicy propertyNamingPolicy = null, JsonNamingPolicy dictionaryKeyPolicy = null, JavaScriptEncoder encoder = null)
 {
     if (indent.HasValue)
     {
         value.WriteIndented = indent == true;
     }
     if (propertyNameCaseInsensitive.HasValue)
     {
         value.PropertyNameCaseInsensitive = propertyNameCaseInsensitive == true;
     }
     value.AllowTrailingCommas  = true;
     value.PropertyNamingPolicy = propertyNamingPolicy;
     value.DictionaryKeyPolicy  = dictionaryKeyPolicy;
     if (encoder != null)
     {
         value.Encoder = encoder;
     }
     value.IgnoreNullValues         = false;
     value.IgnoreReadOnlyProperties = false;
     value.ReadCommentHandling      = JsonCommentHandling.Skip;
     return(value);
 }
示例#12
0
        public static void EscapeString(ReadOnlySpan <char> value, Span <char> destination, int indexOfFirstByteToEscape, JavaScriptEncoder encoder, out int written)
        {
            Debug.Assert(indexOfFirstByteToEscape >= 0 && indexOfFirstByteToEscape < value.Length);

            value.Slice(0, indexOfFirstByteToEscape).CopyTo(destination);
            written = indexOfFirstByteToEscape;
            int consumed = indexOfFirstByteToEscape;

            if (encoder != null)
            {
                destination = destination.Slice(indexOfFirstByteToEscape);
                value       = value.Slice(indexOfFirstByteToEscape);
                EscapeString(value, destination, encoder, ref written);
            }
            else
            {
                // For performance when no encoder is specified, perform escaping here for Ascii and on the
                // first occurrence of a non-Ascii character, then call into the default encoder.
                while (consumed < value.Length)
                {
                    char val = value[consumed];
                    if (IsAsciiValue(val))
                    {
                        if (NeedsEscapingNoBoundsCheck(val))
                        {
                            EscapeNextChars(val, destination, ref written);
                            consumed++;
                        }
                        else
                        {
                            destination[written] = val;
                            written++;
                            consumed++;
                        }
                    }
                    else
                    {
                        // Fall back to default encoder.
                        destination = destination.Slice(written);
                        value       = value.Slice(consumed);
                        EscapeString(value, destination, JavaScriptEncoder.Default, ref written);
                        break;
                    }
                }
            }
        }
示例#13
0
        private static void EscapeString(ReadOnlySpan <char> value, Span <char> destination, JavaScriptEncoder encoder, ref int written)
        {
            // todo: issue #39523: add an Encode(ReadOnlySpan<char>) decode API to System.Text.Encodings.Web.TextEncoding to avoid utf16->utf8->utf16 conversion.

            Debug.Assert(encoder != null);

            // Convert char to byte.
            byte[]      utf8DestinationArray = null;
            Span <byte> utf8Destination;
            int         length = checked ((value.Length) * JsonConstants.MaxExpansionFactorWhileTranscoding);

            if (length > JsonConstants.StackallocThreshold)
            {
                utf8DestinationArray = ArrayPool <byte> .Shared.Rent(length);

                utf8Destination = utf8DestinationArray;
            }
            else
            {
                unsafe
                {
                    byte *ptr = stackalloc byte[JsonConstants.StackallocThreshold];
                    utf8Destination = new Span <byte>(ptr, JsonConstants.StackallocThreshold);
                }
            }

            ReadOnlySpan <byte> utf16Value   = MemoryMarshal.AsBytes(value);
            OperationStatus     toUtf8Status = ToUtf8(utf16Value, utf8Destination, out int bytesConsumed, out int bytesWritten);

            Debug.Assert(toUtf8Status != OperationStatus.DestinationTooSmall);
            Debug.Assert(toUtf8Status != OperationStatus.NeedMoreData);

            if (toUtf8Status != OperationStatus.Done)
            {
                if (utf8DestinationArray != null)
                {
                    utf8Destination.Slice(0, bytesWritten).Clear();
                    ArrayPool <byte> .Shared.Return(utf8DestinationArray);
                }

                ThrowHelper.ThrowArgumentException_InvalidUTF8(utf16Value.Slice(bytesWritten));
            }

            Debug.Assert(toUtf8Status == OperationStatus.Done);
            Debug.Assert(bytesConsumed == utf16Value.Length);

            // Escape the bytes.
            byte[]      utf8ConvertedDestinationArray = null;
            Span <byte> utf8ConvertedDestination;

            length = checked (bytesWritten * JsonConstants.MaxExpansionFactorWhileEscaping);
            if (length > JsonConstants.StackallocThreshold)
            {
                utf8ConvertedDestinationArray = ArrayPool <byte> .Shared.Rent(length);

                utf8ConvertedDestination = utf8ConvertedDestinationArray;
            }
            else
            {
                unsafe
                {
                    byte *ptr = stackalloc byte[JsonConstants.StackallocThreshold];
                    utf8ConvertedDestination = new Span <byte>(ptr, JsonConstants.StackallocThreshold);
                }
            }

            EscapeString(utf8Destination.Slice(0, bytesWritten), utf8ConvertedDestination, indexOfFirstByteToEscape: 0, encoder, out int convertedBytesWritten);

            if (utf8DestinationArray != null)
            {
                utf8Destination.Slice(0, bytesWritten).Clear();
                ArrayPool <byte> .Shared.Return(utf8DestinationArray);
            }

            // Convert byte to char.
#if BUILDING_INBOX_LIBRARY
            OperationStatus toUtf16Status = Utf8.ToUtf16(utf8ConvertedDestination.Slice(0, convertedBytesWritten), destination, out int bytesRead, out int charsWritten);
            Debug.Assert(toUtf16Status == OperationStatus.Done);
            Debug.Assert(bytesRead == convertedBytesWritten);
#else
            string utf16 = JsonReaderHelper.GetTextFromUtf8(utf8ConvertedDestination.Slice(0, convertedBytesWritten));
            utf16.AsSpan().CopyTo(destination);
            int charsWritten = utf16.Length;
#endif
            written += charsWritten;

            if (utf8ConvertedDestinationArray != null)
            {
                utf8ConvertedDestination.Slice(0, written).Clear();
                ArrayPool <byte> .Shared.Return(utf8ConvertedDestinationArray);
            }
        }
示例#14
0
        public void ConfigureServices(IServiceCollection services)
        {
            #region 数据库连接
            services.AddDbContext <SqlServerDBContext>(
                options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection")));
            #endregion

            #region 开启razor sdk的运行时编译
            services.AddControllersWithViews().AddRazorRuntimeCompilation();
            #endregion

            #region 支持 Razor 页面
            services.AddRazorPages();
            #endregion

            services.AddControllers();

            #region Swagger配置
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Version     = "v1.0.0",
                    Title       = "WebAPI",
                    Description = "外包电子合同WebApi接口",
                    Contact     = new OpenApiContact()
                    {
                        Name  = "David Zhou",
                        Email = "*****@*****.**"
                    }
                });
            });
            #endregion

            #region IP限流配置

            // 存储IP计数器及配置规则
            services.AddMemoryCache();
            // 配置
            services.Configure <IpRateLimitOptions>(options =>
            {
                //options.EnableEndpointRateLimiting = true; // true,意思是IP限制会应用于单个配置的Endpoint上,false,只能限制所有接口Endpoint只能为*
                options.HttpStatusCode        = 429; // 触发限制之后给客户端返回的HTTP状态码
                options.RealIpHeader          = "X-Real-IP";
                options.ClientIdHeader        = "X-ClientId";
                options.QuotaExceededResponse = new QuotaExceededResponse // 触发限制之后给客户端返回的数据
                {
                    Content     = "{{\"code\":-1,\"msg\":\"访问过于频繁,请稍后重试\"}}",
                    ContentType = "application/json",
                    StatusCode  = 429
                };
                // 限制规则
                options.GeneralRules = new List <RateLimitRule>
                {
                    new RateLimitRule
                    {
                        //Endpoint = "*:/signtoken",// 正则匹配规则,只针对签发token接口
                        Endpoint = "*",
                        Period   = "1s", // 周期 s秒 m分钟 h时 d天
                        Limit    = 10,   // 次数
                    }
                };
            });

            // 注入计数器和规则存储
            services.AddSingleton <IIpPolicyStore, MemoryCacheIpPolicyStore>();
            services.AddSingleton <IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
            // the clientId/clientIp resolvers use it.
            services.AddHttpContextAccessor();
            // 配置(计数器密钥生成器)
            services.AddSingleton <IRateLimitConfiguration, RateLimitConfiguration>();

            #endregion

            #region 跨域设置
            //注意:放到services.AddMvc()之前
            services.AddCors(options => options.AddPolicy("AllowAll",
                                                          builder =>
            {
                builder.SetIsOriginAllowed(_ => true)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials();
            }));

            #endregion

            #region 添加MVC服务,取消默认驼峰命名
            services.AddMvc()
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
                options.JsonSerializerOptions.PropertyNamingPolicy = null;
            });
            #endregion

            #region Api 数据格式配置
            services.AddControllersWithViews().AddNewtonsoftJson(options =>
            {
                //忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                //使用驼峰样式
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                //设置时间格式
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            });
            #endregion

            #region 中间件注册

            #region 基础管理
            //人员合同服务
            services.AddTransient <IPersonService, PersonService>();
            //人员附件服务
            services.AddTransient <IECPersonFileInfoService, ECPersonFileInfoService>();

            //log帮助类
            services.AddSingleton <ILoggerHelper, LoggerHelper>();

            //log4net
            repository = LogManager.CreateRepository("WebApp");                    //项目名称
            XmlConfigurator.Configure(repository, new FileInfo("Log4net.config")); //指定配置文件
            #endregion

            #endregion

            #region 过滤器
            services.AddControllers(option => {
                //全局异常过滤器
                option.Filters.Add(typeof(GlobalExceptionFilter));
            });
            #endregion
        }
示例#15
0
    private void BuildFallbackBlock(TagHelperAttributeList attributes, TagHelperContent builder)
    {
        EnsureGlobbingUrlBuilder();

        var fallbackSrcs = GlobbingUrlBuilder.BuildUrlList(FallbackSrc, FallbackSrcInclude, FallbackSrcExclude);

        if (fallbackSrcs.Count > 0)
        {
            // Build the <script> tag that checks the test method and if it fails, renders the extra script.
            builder.AppendHtml(Environment.NewLine)
            .AppendHtml("<script>(")
            .AppendHtml(FallbackTestExpression)
            .AppendHtml("||document.write(\"");

            foreach (var src in fallbackSrcs)
            {
                // Fallback "src" values come from bound attributes and globbing. Must always be non-null.
                Debug.Assert(src != null);

                StringWriter.Write("<script");

                var addSrc = true;

                // Perf: Avoid allocating enumerator and read interface .Count once rather than per iteration
                var attributesCount = attributes.Count;
                for (var i = 0; i < attributesCount; i++)
                {
                    var attribute = attributes[i];
                    if (!attribute.Name.Equals(SrcAttributeName, StringComparison.OrdinalIgnoreCase))
                    {
                        if (SuppressFallbackIntegrity && string.Equals(IntegrityAttributeName, attribute.Name, StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        StringWriter.Write(' ');
                        attribute.WriteTo(StringWriter, HtmlEncoder);
                    }
                    else
                    {
                        addSrc = false;
                        WriteVersionedSrc(attribute.Name, src, attribute.ValueStyle, StringWriter);
                    }
                }

                if (addSrc)
                {
                    WriteVersionedSrc(SrcAttributeName, src, HtmlAttributeValueStyle.DoubleQuotes, StringWriter);
                }

                StringWriter.Write("></script>");
            }

            var stringBuilder = StringWriter.GetStringBuilder();
            var scriptTags    = stringBuilder.ToString();
            stringBuilder.Clear();
            var encodedScriptTags = JavaScriptEncoder.Encode(scriptTags);
            builder.AppendHtml(encodedScriptTags);

            builder.AppendHtml("\"));</script>");
        }
    }
示例#16
0
        public static void EscapeString(ReadOnlySpan <byte> value, Span <byte> destination, int indexOfFirstByteToEscape, JavaScriptEncoder encoder, out int written)
        {
            Debug.Assert(indexOfFirstByteToEscape >= 0 && indexOfFirstByteToEscape < value.Length);

            value.Slice(0, indexOfFirstByteToEscape).CopyTo(destination);
            written = indexOfFirstByteToEscape;
            int consumed = indexOfFirstByteToEscape;

            if (encoder != null)
            {
                OperationStatus result = encoder.EncodeUtf8(
                    value.Slice(consumed), destination.Slice(written), out int encoderBytesConsumed, out int encoderBytesWritten);

                Debug.Assert(result != OperationStatus.DestinationTooSmall);
                Debug.Assert(result != OperationStatus.NeedMoreData);
                Debug.Assert(encoderBytesConsumed == value.Length - consumed);

                if (result != OperationStatus.Done)
                {
                    ThrowHelper.ThrowArgumentException_InvalidUTF8(value.Slice(encoderBytesWritten));
                }

                written += encoderBytesWritten;
            }
            else
            {
                // For performance when no encoder is specified, perform escaping here for Ascii and on the
                // first occurrence of a non-Ascii character, then call into the default encoder.
                while (consumed < value.Length)
                {
                    byte val = value[consumed];
                    if (IsAsciiValue(val))
                    {
                        if (NeedsEscapingNoBoundsCheck(val))
                        {
                            EscapeNextBytes(val, destination, ref written);
                            consumed++;
                        }
                        else
                        {
                            destination[written] = val;
                            written++;
                            consumed++;
                        }
                    }
                    else
                    {
                        // Fall back to default encoder
                        OperationStatus result = JavaScriptEncoder.Default.EncodeUtf8(
                            value.Slice(consumed), destination.Slice(written), out int encoderBytesConsumed, out int encoderBytesWritten);

                        Debug.Assert(result != OperationStatus.DestinationTooSmall);
                        Debug.Assert(result != OperationStatus.NeedMoreData);
                        Debug.Assert(encoderBytesConsumed == value.Length - consumed);

                        if (result != OperationStatus.Done)
                        {
                            ThrowHelper.ThrowArgumentException_InvalidUTF8(value.Slice(encoderBytesConsumed));
                        }

                        consumed += encoderBytesConsumed;
                        written  += encoderBytesWritten;
                    }
                }
            }
        }
示例#17
0
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration      = context.Services.GetConfiguration();

            Configure <AbpAutoMapperOptions>(options =>
            {
                options.AddProfile <ApiGatewayMapperProfile>(validate: true);
            });

            Configure <ApiGatewayOptions>(configuration.GetSection("ApiGateway"));

            // 中文序列化的编码问题
            Configure <AbpSystemTextJsonSerializerOptions>(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

            context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority            = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.Audience             = configuration["AuthServer:ApiName"];
            });

            Configure <AbpDistributedCacheOptions>(options =>
            {
                // 最好统一命名,不然某个缓存变动其他应用服务有例外发生
                options.KeyPrefix = "LINGYUN.Abp.Application";
                // 滑动过期30天
                options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
                // 绝对过期60天
                options.GlobalCacheEntryOptions.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
            });

            Configure <RedisCacheOptions>(options =>
            {
                var redisConfig = ConfigurationOptions.Parse(options.Configuration);
                options.ConfigurationOptions = redisConfig;
                options.InstanceName         = configuration["Redis:InstanceName"];
            });

            // 加解密
            Configure <AbpStringEncryptionOptions>(options =>
            {
                var encryptionConfiguration = configuration.GetSection("Encryption");
                if (encryptionConfiguration.Exists())
                {
                    options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
                    options.DefaultSalt       = encryptionConfiguration.GetSection("Salt").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
                        : options.DefaultSalt;
                    options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
                        : options.InitVectorBytes;
                }
            });

            Configure <AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded <ApiGatewayHostModule>();
            });

            Configure <AbpLocalizationOptions>(options =>
            {
                options.Languages.Add(new LanguageInfo("en", "en", "English"));
                options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));

                options.Resources
                .Get <ApiGatewayResource>()
                .AddVirtualJson("/Localization/Host");
            });

            var mvcBuilder = context.Services.AddMvc();

            mvcBuilder.AddApplicationPart(typeof(ApiGatewayHostModule).Assembly);

            Configure <AbpEndpointRouterOptions>(options =>
            {
                options.EndpointConfigureActions.Add(endpointContext =>
                {
                    endpointContext.Endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
                    endpointContext.Endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
                });
            });

            if (!hostingEnvironment.IsDevelopment())
            {
                // Ssl证书
                var sslOptions = configuration.GetSection("App:SslOptions");
                if (sslOptions.Exists())
                {
                    var fileName = sslOptions["FileName"];
                    var password = sslOptions["Password"];
                    Configure <KestrelServerOptions>(options =>
                    {
                        options.ConfigureEndpointDefaults(cfg =>
                        {
                            cfg.UseHttps(fileName, password);
                        });
                    });
                }

                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
                context.Services
                .AddDataProtection()
                .PersistKeysToStackExchangeRedis(redis, "ApiGatewayHost-Protection-Keys");
            }

            context.Services
            .AddOcelot()
            .AddPolly()
            .AddSingletonDefinedAggregator <AbpApiDefinitionAggregator>();
        }
示例#18
0
        private static void EscapeString(ReadOnlySpan <byte> value, Span <byte> destination, JavaScriptEncoder encoder, ref int written)
        {
            Debug.Assert(encoder != null);

            OperationStatus result = encoder.EncodeUtf8(value, destination, out int encoderBytesConsumed, out int encoderBytesWritten);

            Debug.Assert(result != OperationStatus.DestinationTooSmall);
            Debug.Assert(result != OperationStatus.NeedMoreData);

            if (result != OperationStatus.Done)
            {
                ThrowHelper.ThrowArgumentException_InvalidUTF8(value.Slice(encoderBytesWritten));
            }

            Debug.Assert(encoderBytesConsumed == value.Length);

            written += encoderBytesWritten;
        }
示例#19
0
        public IAliceResponseBase ProcessRequest(SportsRequest sportsRequest)
        {
            if (sportsRequest == null)
            {
                throw new ArgumentNullException(nameof(sportsRequest));
            }

            if (sportsRequest.Request.OriginalUtterance == "ping")
            {
                return(new SportsResponse(sportsRequest, "Привет, Яндекс! У меня все в порядке :)"));
            }

            SceneType currentSceneType = SceneType.Undefined;

            if (sportsRequest.Session.New)
            {
                currentSceneType            = SceneType.Welcome;
                sportsRequest.State.Session = new SportsSessionState();
            }

            if (sportsRequest.Request.Nlu.Intents.Read != null)
            {
                InfoType infoType = InfoType.Undefined;
                if (sportsRequest.Request.Nlu.Intents.Read.Slots.InfoType != null)
                {
                    infoType = sportsRequest.Request.Nlu.Intents.Read.Slots.InfoType.Value;
                }

                InfoCategory infoCategory = InfoCategory.Undefined;
                if (sportsRequest.Request.Nlu.Intents.Read.Slots.InfoCategory != null)
                {
                    infoCategory = sportsRequest.Request.Nlu.Intents.Read.Slots.InfoCategory.Value;
                }

                if (infoType == InfoType.Comments)
                {
                    currentSceneType = SceneType.BestComments;
                }
                else if (infoType == InfoType.News)
                {
                    if (infoCategory == InfoCategory.Main)
                    {
                        currentSceneType = SceneType.MainNews;
                    }
                    else
                    {
                        currentSceneType = SceneType.LatestNews;
                    }
                }
            }
            else if (sportsRequest.Request.Nlu.Intents.IsHelp)
            {
                currentSceneType = SceneType.Help;
            }

            Scene currentScene;

            if (currentSceneType != SceneType.Undefined)
            {
                currentScene = _scenesProvider.GetScene(currentSceneType);
                return(currentScene.Reply(sportsRequest));
            }
            else
            {
                currentScene = _scenesProvider.GetScene(sportsRequest.State.Session.CurrentScene);
                if (sportsRequest.Request.Nlu.Intents.IsRepeat)
                {
                    return(currentScene.Repeat(sportsRequest));
                }
                var nextScene = currentScene.MoveToNextScene(sportsRequest);
                if (nextScene != null)
                {
                    return(nextScene.Reply(sportsRequest));
                }
            }

            var options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
            };
            var requestText = JsonSerializer.Serialize(sportsRequest, options);

            _fallbackLogger.LogInformation("FALLBACK. Request: {0}", requestText);
            return(currentScene.Fallback(sportsRequest));
        }
示例#20
0
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration      = context.Services.GetConfiguration();

            // 请求代理配置
            Configure <ForwardedHeadersOptions>(options =>
            {
                configuration.GetSection("App:Forwarded").Bind(options);
                // 对于生产环境,为安全考虑需要在配置中指定受信任代理服务器
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

            Configure <AbpDbContextOptions>(options =>
            {
                options.UseMySQL();
            });

            // 解决某些不支持类型的序列化
            Configure <AbpJsonOptions>(options =>
            {
                options.UseHybridSerializer = true;
            });
            // 中文序列化的编码问题
            Configure <AbpSystemTextJsonSerializerOptions>(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

            // 加解密
            Configure <AbpStringEncryptionOptions>(options =>
            {
                var encryptionConfiguration = configuration.GetSection("Encryption");
                if (encryptionConfiguration.Exists())
                {
                    options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
                    options.DefaultSalt       = encryptionConfiguration.GetSection("Salt").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
                        : options.DefaultSalt;
                    options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
                        : options.InitVectorBytes;

                    var keySizeConfig = encryptionConfiguration.GetSection("Keysize");
                    options.Keysize   = keySizeConfig.Exists()
                        ? keySizeConfig.Get <int>()
                        : options.Keysize;
                }
            });

            Configure <AbpDistributedCacheOptions>(options =>
            {
                // 最好统一命名,不然某个缓存变动其他应用服务有例外发生
                options.KeyPrefix = "LINGYUN.Abp.Application";
                // 滑动过期30天
                options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
                // 绝对过期60天
                options.GlobalCacheEntryOptions.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
            });

            Configure <RedisCacheOptions>(options =>
            {
                var redisConfig = ConfigurationOptions.Parse(options.Configuration);
                options.ConfigurationOptions = redisConfig;
                options.InstanceName         = configuration["Redis:InstanceName"];
            });

            // 增加配置文件定义,在新建租户时需要
            Configure <IdentityOptions>(options =>
            {
                var identityConfiguration = configuration.GetSection("Identity");
                if (identityConfiguration.Exists())
                {
                    identityConfiguration.Bind(options);
                }
            });

            Configure <AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded <AuthIdentityServerModule>("AuthServer");
            });

            Configure <AbpLocalizationOptions>(options =>
            {
                options.Languages.Add(new LanguageInfo("en", "en", "English"));
                options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));

                options.Resources
                .Get <AccountResource>()
                .AddVirtualJson("/Localization/Resources");
            });

            Configure <AbpAuditingOptions>(options =>
            {
                // options.IsEnabledForGetRequests = true;
                options.ApplicationName = "Identity-Server-STS";
            });

            Configure <AppUrlOptions>(options =>
            {
                options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
                // 邮件登录地址
                options.Applications["MVC"].Urls["EmailVerifyLogin"] = "******";
            });

            context.Services.ConfigureNonBreakingSameSiteCookies();

            // context.Services.AddAuthentication();
            context.Services.AddAuthentication()
            .AddJwtBearer(options =>
            {
                options.Authority            = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.Audience             = configuration["AuthServer:ApiName"];
            });



            if (!hostingEnvironment.IsDevelopment())
            {
                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
                context.Services
                .AddDataProtection()
                .PersistKeysToStackExchangeRedis(redis, "AuthServer-Protection-Keys");
            }

            Configure <AbpMultiTenancyOptions>(options =>
            {
                options.IsEnabled = true;
            });

            var tenantResolveCfg = configuration.GetSection("App:Domains");

            if (tenantResolveCfg.Exists())
            {
                Configure <AbpTenantResolveOptions>(options =>
                {
                    var domains = tenantResolveCfg.Get <string[]>();
                    foreach (var domain in domains)
                    {
                        options.AddDomainTenantResolver(domain);
                    }
                });
            }

            context.Services.AddCors(options =>
            {
                options.AddPolicy(DefaultCorsPolicyName, builder =>
                {
                    builder
                    .WithOrigins(
                        configuration["App:CorsOrigins"]
                        .Split(",", StringSplitOptions.RemoveEmptyEntries)
                        .Select(o => o.RemovePostFix("/"))
                        .ToArray()
                        )
                    .WithAbpExposedHeaders()
                    .SetIsOriginAllowedToAllowWildcardSubdomains()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials();
                });
            });
        }
示例#21
0
        private void BuildFallbackBlock(TagHelperAttributeList attributes, TagHelperContent builder)
        {
            EnsureGlobbingUrlBuilder();
            var fallbackHrefs = GlobbingUrlBuilder.BuildUrlList(
                FallbackHref,
                FallbackHrefInclude,
                FallbackHrefExclude);

            if (fallbackHrefs.Count == 0)
            {
                return;
            }

            builder.AppendHtml(HtmlString.NewLine);

            // Build the <meta /> tag that's used to test for the presence of the stylesheet
            builder
            .AppendHtml("<meta name=\"x-stylesheet-fallback-test\" content=\"\" class=\"")
            .Append(FallbackTestClass)
            .AppendHtml("\" />");

            // Build the <script /> tag that checks the effective style of <meta /> tag above and renders the extra
            // <link /> tag to load the fallback stylesheet if the test CSS property value is found to be false,
            // indicating that the primary stylesheet failed to load.
            // GetEmbeddedJavaScript returns JavaScript to which we add '"{0}","{1}",{2});'
            builder
            .AppendHtml("<script>")
            .AppendHtml(JavaScriptResources.GetEmbeddedJavaScript(FallbackJavaScriptResourceName))
            .AppendHtml("\"")
            .AppendHtml(JavaScriptEncoder.Encode(FallbackTestProperty))
            .AppendHtml("\",\"")
            .AppendHtml(JavaScriptEncoder.Encode(FallbackTestValue))
            .AppendHtml("\",");

            AppendFallbackHrefs(builder, fallbackHrefs);

            builder.AppendHtml(", \"");

            // Perf: Avoid allocating enumerator
            for (var i = 0; i < attributes.Count; i++)
            {
                var attribute = attributes[i];
                if (string.Equals(attribute.Name, HrefAttributeName, StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                attribute.WriteTo(StringWriter, HtmlEncoder);
                StringWriter.Write(' ');
            }

            var stringBuilder = StringWriter.GetStringBuilder();
            var scriptTags    = stringBuilder.ToString();

            stringBuilder.Clear();
            var encodedScriptTags = JavaScriptEncoder.Encode(scriptTags);

            builder.AppendHtml(encodedScriptTags);

            builder.AppendHtml("\");</script>");
        }
 public AntiScriptController(HtmlEncoder htmlEncoder, JavaScriptEncoder javaScriptEncoder, UrlEncoder urlEncoder)
 {
     _htmlEncoder       = htmlEncoder;
     _javaScriptEncoder = javaScriptEncoder;
     _urlEncoder        = urlEncoder;
 }
示例#23
0
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration      = hostingEnvironment.BuildConfiguration();

            // 请求代理配置
            Configure <ForwardedHeadersOptions>(options =>
            {
                configuration.GetSection("App:Forwarded").Bind(options);
                // 对于生产环境,为安全考虑需要在配置中指定受信任代理服务器
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

            // 配置Ef
            Configure <AbpDbContextOptions>(options =>
            {
                options.UseMySQL();
                //if (hostingEnvironment.IsDevelopment())
                //{
                //    options.PreConfigure(ctx =>
                //    {
                //        ctx.DbContextOptions.EnableDetailedErrors();
                //        ctx.DbContextOptions.EnableSensitiveDataLogging();
                //    });
                //}
            });

            // 解决某些不支持类型的序列化
            Configure <AbpJsonOptions>(options =>
            {
                options.UseHybridSerializer = true;
            });
            // 中文序列化的编码问题
            Configure <AbpSystemTextJsonSerializerOptions>(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

            // 加解密
            Configure <AbpStringEncryptionOptions>(options =>
            {
                var encryptionConfiguration = configuration.GetSection("Encryption");
                if (encryptionConfiguration.Exists())
                {
                    options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
                    options.DefaultSalt       = encryptionConfiguration.GetSection("Salt").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
                        : options.DefaultSalt;
                    options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
                        : options.InitVectorBytes;
                }
            });

            Configure <PermissionManagementOptions>(options =>
            {
                // Rename IdentityServer.Client.ManagePermissions
                // See https://github.com/abpframework/abp/blob/dev/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs
                options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] =
                    LINGYUN.Abp.IdentityServer.AbpIdentityServerPermissions.Clients.ManagePermissions;
            });

            // 自定义需要处理的异常
            Configure <AbpExceptionHandlingOptions>(options =>
            {
                //  加入需要处理的异常类型
                options.Handlers.Add <Volo.Abp.Data.AbpDbConcurrencyException>();
                options.Handlers.Add <AbpInitializationException>();
                options.Handlers.Add <ObjectDisposedException>();
                options.Handlers.Add <StackOverflowException>();
                options.Handlers.Add <OutOfMemoryException>();
                options.Handlers.Add <System.Data.Common.DbException>();
                options.Handlers.Add <Microsoft.EntityFrameworkCore.DbUpdateException>();
                options.Handlers.Add <System.Data.DBConcurrencyException>();
            });
            // 自定义需要发送邮件通知的异常类型
            Configure <AbpEmailExceptionHandlingOptions>(options =>
            {
                // 是否发送堆栈信息
                options.SendStackTrace = true;
            });

            Configure <AbpAuditingOptions>(options =>
            {
                options.ApplicationName = "Identity-Server-Admin";
                // 是否启用实体变更记录
                var entitiesChangedConfig = configuration.GetSection("App:TrackingEntitiesChanged");
                if (entitiesChangedConfig.Exists() && entitiesChangedConfig.Get <bool>())
                {
                    options
                    .EntityHistorySelectors
                    .AddAllEntities();
                }
            });

            Configure <AbpDistributedCacheOptions>(options =>
            {
                // 最好统一命名,不然某个缓存变动其他应用服务有例外发生
                options.KeyPrefix = "LINGYUN.Abp.Application";
                // 滑动过期30天
                options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
                // 绝对过期60天
                options.GlobalCacheEntryOptions.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60);
            });

            Configure <AbpDistributedEntityEventOptions>(options =>
            {
                options.AutoEventSelectors.AddNamespace("Volo.Abp.Identity");
                options.AutoEventSelectors.AddNamespace("Volo.Abp.IdentityServer");
            });

            Configure <RedisCacheOptions>(options =>
            {
                var redisConfig = ConfigurationOptions.Parse(options.Configuration);
                options.ConfigurationOptions = redisConfig;
                options.InstanceName         = configuration["Redis:InstanceName"];
            });

            Configure <AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded <AbpIdentityServerAdminHttpApiHostModule>("LINGYUN.Abp.IdentityServer4");
            });

            // 多租户
            Configure <AbpMultiTenancyOptions>(options =>
            {
                options.IsEnabled = true;
            });

            var tenantResolveCfg = configuration.GetSection("App:Domains");

            if (tenantResolveCfg.Exists())
            {
                Configure <AbpTenantResolveOptions>(options =>
                {
                    var domains = tenantResolveCfg.Get <string[]>();
                    foreach (var domain in domains)
                    {
                        options.AddDomainTenantResolver(domain);
                    }
                });
            }

            // Swagger
            context.Services.AddSwaggerGen(
                options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "IdentityServer4 API", Version = "v1"
                });
                options.DocInclusionPredicate((docName, description) => true);
                options.CustomSchemaIds(type => type.FullName);
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description  = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name         = "Authorization",
                    In           = ParameterLocation.Header,
                    Scheme       = "bearer",
                    Type         = SecuritySchemeType.Http,
                    BearerFormat = "JWT"
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme, Id = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
            });

            // 支持本地化语言类型
            Configure <AbpLocalizationOptions>(options =>
            {
                options.Languages.Add(new LanguageInfo("en", "en", "English"));
                options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));

                options.Resources
                .Get <IdentityResource>()
                .AddVirtualJson("/LINGYUN/Abp/IdentityServer4/Localization");

                options.Resources.AddDynamic(typeof(IdentityResource));
            });

            Configure <AbpClaimsMapOptions>(options =>
            {
                options.Maps.TryAdd("name", () => AbpClaimTypes.UserName);
            });

            context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority            = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.Audience             = configuration["AuthServer:ApiName"];
            });

            if (!hostingEnvironment.IsDevelopment())
            {
                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
                context.Services
                .AddDataProtection()
                .PersistKeysToStackExchangeRedis(redis, "BackendAdmin-Protection-Keys");
            }
        }
示例#24
0
        // Methods
        public void ConfigureServices(IServiceCollection services)
        {
            #region Contracts

            if (services == null)
            {
                throw new ArgumentException(nameof(services));
            }

            #endregion

            // Services
            services.AddSingleton <JwtHelper>();

            // Mvc
            var mvcBuilder = services.AddMvc();
            {
                // JsonOptions
                mvcBuilder.AddJsonOptions(options =>
                {
                    // Encoder
                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs);
                });
            }

            // Authentication
            var authenticationBuilder = services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme);
            {
                // Config
                var issuer  = "PermissionLab";
                var signKey = "12345678901234567890123456789012";

                // JwtBearer
                authenticationBuilder.AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        // Setting
                        AuthenticationType = "JWT",

                        // Issuer
                        ValidateIssuer = true,
                        ValidIssuer    = issuer,

                        // Audience
                        ValidateAudience = false,
                        ValidAudience    = null,

                        // Lifetime
                        ValidateLifetime = true,
                        ClockSkew        = TimeSpan.Zero,

                        // Signing
                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey         = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signKey)),
                    };
                });

                // AuthorizationHandler
                services.AddSingleton <IAuthorizationHandler, PermissionAuthorizationHandler>();
                services.AddSingleton <PermissionRepository, MockPermissionRepository>();
            }
        }
 public static JsonSerializerOptionsBuilder SetEncoderToUnicodeRangeAll(this JsonSerializerOptionsBuilder builder)
 {
     return(SetActionBase(
                builder,
                t => t.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)));
 }
示例#26
0
 public string JavaScriptEncode(string content)
 {
     return(JavaScriptEncoder.Encode(content));
 }
示例#27
0
 public unsafe void FindFirstCharacterToEncode(char replacementChar, JavaScriptEncoder encoder, bool requiresEscaping)
 {
     Assert.Equal(-1, encoder.FindFirstCharacterToEncodeUtf8(default));
 public static JavaScriptEncoder GetAdncDefaultEncoder()
 {
     return(JavaScriptEncoder.Create(new TextEncoderSettings(UnicodeRanges.All)));
 }
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration      = hostingEnvironment.BuildConfiguration();

            // 请求代理配置
            Configure <ForwardedHeadersOptions>(options =>
            {
                configuration.GetSection("App:Forwarded").Bind(options);
                // 对于生产环境,为安全考虑需要在配置中指定受信任代理服务器
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

            // 配置Ef
            Configure <AbpDbContextOptions>(options =>
            {
                options.UseMySQL();
            });

            // 解决某些不支持类型的序列化
            Configure <AbpJsonOptions>(options =>
            {
                options.UseHybridSerializer = true;
            });
            // 中文序列化的编码问题
            Configure <AbpSystemTextJsonSerializerOptions>(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            });

            // 加解密
            Configure <AbpStringEncryptionOptions>(options =>
            {
                var encryptionConfiguration = configuration.GetSection("Encryption");
                if (encryptionConfiguration.Exists())
                {
                    options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
                    options.DefaultSalt       = encryptionConfiguration.GetSection("Salt").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
                        : options.DefaultSalt;
                    options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
                        ? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
                        : options.InitVectorBytes;
                }
            });

            Configure <AbpExceptionHandlingOptions>(options =>
            {
                //  加入需要处理的异常类型
                options.Handlers.Add <Volo.Abp.Data.AbpDbConcurrencyException>();
                options.Handlers.Add <AbpInitializationException>();
                options.Handlers.Add <ObjectDisposedException>();
                options.Handlers.Add <StackOverflowException>();
                options.Handlers.Add <OutOfMemoryException>();
                options.Handlers.Add <System.Data.Common.DbException>();
                options.Handlers.Add <Microsoft.EntityFrameworkCore.DbUpdateException>();
                options.Handlers.Add <System.Data.DBConcurrencyException>();
            });

            Configure <AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded <AbpMessageServiceHttpApiHostModule>("LINGYUN.Abp.MessageService");
            });

            // 多租户
            Configure <AbpMultiTenancyOptions>(options =>
            {
                options.IsEnabled = true;
            });

            var tenantResolveCfg = configuration.GetSection("App:Domains");

            if (tenantResolveCfg.Exists())
            {
                Configure <AbpTenantResolveOptions>(options =>
                {
                    var domains = tenantResolveCfg.Get <string[]>();
                    foreach (var domain in domains)
                    {
                        options.AddDomainTenantResolver(domain);
                    }
                });
            }

            Configure <AbpDistributedCacheOptions>(options =>
            {
                // 最好统一命名,不然某个缓存变动其他应用服务有例外发生
                options.KeyPrefix = "LINGYUN.Abp.Application";
                // 滑动过期30天
                options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
                // 绝对过期60天
                options.GlobalCacheEntryOptions.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
            });

            Configure <RedisCacheOptions>(options =>
            {
                var redisConfig = ConfigurationOptions.Parse(options.Configuration);
                options.ConfigurationOptions = redisConfig;
                options.InstanceName         = configuration["Redis:InstanceName"];
            });

            // Swagger
            context.Services.AddSwaggerGen(
                options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "MessageService API", Version = "v1"
                });
                options.DocInclusionPredicate((docName, description) => true);
                options.CustomSchemaIds(type => type.FullName);
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description  = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name         = "Authorization",
                    In           = ParameterLocation.Header,
                    Scheme       = "bearer",
                    Type         = SecuritySchemeType.Http,
                    BearerFormat = "JWT"
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme, Id = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
            });

            context.Services.AddCors(options =>
            {
                options.AddPolicy(DefaultCorsPolicyName, builder =>
                {
                    builder
                    .WithOrigins(
                        configuration["App:CorsOrigins"]
                        .Split(",", StringSplitOptions.RemoveEmptyEntries)
                        .Select(o => o.RemovePostFix("/"))
                        .ToArray()
                        )
                    .WithAbpExposedHeaders()
                    .SetIsOriginAllowedToAllowWildcardSubdomains()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials();
                });
            });

            Configure <HangfireDashboardRouteOptions>(options =>
            {
                if (configuration.GetSection("Hangfire:Dashboard:WhiteList").Exists())
                {
                    options.WithWhite(
                        configuration["Hangfire:Dashboard:WhiteList"]
                        .Split(",", StringSplitOptions.RemoveEmptyEntries)
                        .Select(o => o.RemovePostFix("/"))
                        .ToArray());
                }

                options.WithOrigins(
                    configuration["App:CorsOrigins"]
                    .Split(",", StringSplitOptions.RemoveEmptyEntries)
                    .Select(o => o.RemovePostFix("/"))
                    .ToArray()
                    );
            });

            // 支持本地化语言类型
            Configure <AbpLocalizationOptions>(options =>
            {
                options.Languages.Add(new LanguageInfo("en", "en", "English"));
                options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));

                options.Resources
                .Get <MessageServiceResource>()
                .AddVirtualJson("/Localization/HttpApiHost");
            });

            Configure <AbpClaimsMapOptions>(options =>
            {
                options.Maps.TryAdd("name", () => AbpClaimTypes.UserName);
            });

            context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority            = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = false;
                options.Audience             = configuration["AuthServer:ApiName"];
            });

            if (!hostingEnvironment.IsDevelopment())
            {
                var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
                context.Services
                .AddDataProtection()
                .PersistKeysToStackExchangeRedis(redis, "MessageService-Protection-Keys");
            }
        }
示例#30
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            #region 仓储和service等依赖注入

            services.RegisterAssembly("CronJobs", Lifecycle.Scoped);

            MongoClient client = new MongoClient(SettingManager.GetValue("MongoDB:ConnectionString"));
            services.AddSingleton(client);
            //services.AddScoped<IRepository<User>, UserRepository>();

            #endregion

            //// Register the Swagger generator, defining 1 or more Swagger documents
            //services.AddSwaggerGen(c =>
            //{swagger 对应3.1core的还在测试阶段。
            //    c.SwaggerDoc("v1", new Info { Title = "CronJobs", Version = "v1" });
            //    c.CustomSchemaIds(type => type.FullName); // 解决相同类名会报错的问题
            //    c.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CronJobs.xml"));
            //});

            //services.AddAutoMapper();  这里使用另一种automapper的注入方式
            AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile <DtoProfile>();
            });
            services.AddSingleton(config);
            services.AddScoped <IMapper, Mapper>();

            //services.AddHostedService<QuartzService>();

            //var schedulerFactory = new StdSchedulerFactory();
            //var scheduler = schedulerFactory.GetScheduler().Result;
            ////scheduler.ListenerManager.AddTriggerListener(new MyTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup());
            //scheduler.ListenerManager.AddJobListener(new JobListener(), GroupMatcher<JobKey>.AnyGroup());
            //scheduler.ListenerManager.AddSchedulerListener(new SchedulerListener());
            //scheduler.Start();


            services.AddControllers()
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
            })
            .ConfigureApiBehaviorOptions(options =>
            {
                //options.SuppressModelStateInvalidFilter = true;
                options.InvalidModelStateResponseFactory = context =>
                {
                    var validationErrors = context.ModelState
                                           .Keys
                                           .SelectMany(k => context.ModelState[k].Errors)
                                           .Select(e => e.ErrorMessage)
                                           .ToArray();
                    var json = BaseResponse.GetBaseResponse(BusinessStatusType.ParameterError, string.Join(",", validationErrors));

                    return(new BadRequestObjectResult(json)
                    {
                        ContentTypes = { "application/problem+json" }
                    });
                };
            })
            ;
        }