public Upload(IHtmlGenerator generator, JavaScriptEncoder javaScriptEncoder) : base(generator) { this.JavaScriptEncoder = javaScriptEncoder; }
/// <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) { }
/// <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[] { } }, }); }); }
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(); } } }
// 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 }
/// <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); }
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); }
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; } } } }
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); } }
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 }
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>"); } }
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; } } } }
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>(); }
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; }
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)); }
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(); }); }); }
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; }
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"); } }
// 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))); }
public string JavaScriptEncode(string content) { return(JavaScriptEncoder.Encode(content)); }
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"); } }
// 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" } }); }; }) ; }