diff --git a/Directory.Build.props b/Directory.Build.props index 448d547f..264ab376 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/src/admin/Bootstrap.Admin/Bootstrap.Admin.csproj b/src/admin/Bootstrap.Admin/Bootstrap.Admin.csproj index e8d36643..a1a60f93 100644 --- a/src/admin/Bootstrap.Admin/Bootstrap.Admin.csproj +++ b/src/admin/Bootstrap.Admin/Bootstrap.Admin.csproj @@ -1,9 +1,10 @@  - netcoreapp2.2 + netcoreapp3.0 + true - + $(MSBuildProjectName).xml Windows @@ -13,12 +14,12 @@ + - - + + + - - diff --git a/src/admin/Bootstrap.Admin/Controllers/AdminController.cs b/src/admin/Bootstrap.Admin/Controllers/AdminController.cs index cfb9bc5a..813ec53f 100644 --- a/src/admin/Bootstrap.Admin/Controllers/AdminController.cs +++ b/src/admin/Bootstrap.Admin/Controllers/AdminController.cs @@ -108,7 +108,7 @@ namespace Bootstrap.Admin.Controllers /// /// /// - public ActionResult Profiles([FromServices]IHostingEnvironment host) => View(new ProfilesModel(this, host)); + public ActionResult Profiles([FromServices]IWebHostEnvironment host) => View(new ProfilesModel(this, host)); /// /// diff --git a/src/admin/Bootstrap.Admin/Controllers/Api/ProfilesController.cs b/src/admin/Bootstrap.Admin/Controllers/Api/ProfilesController.cs index 3f3240c4..f4f83be9 100644 --- a/src/admin/Bootstrap.Admin/Controllers/Api/ProfilesController.cs +++ b/src/admin/Bootstrap.Admin/Controllers/Api/ProfilesController.cs @@ -1,4 +1,4 @@ -using Bootstrap.DataAccess; +using Bootstrap.DataAccess; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -24,7 +24,7 @@ namespace Bootstrap.Admin.Controllers.Api /// [HttpPost("{id}")] [ButtonAuthorize(Url = "~/Admin/Profiles", Auth = "saveIcon")] - public JsonResult Post(string id, [FromServices]IHostingEnvironment env, [FromForm]DeleteFileCollection files) + public JsonResult Post(string id, [FromServices]IWebHostEnvironment env, [FromForm]DeleteFileCollection files) { if (!id.Equals("Delete", StringComparison.OrdinalIgnoreCase)) return new JsonResult(new object()); @@ -72,7 +72,7 @@ namespace Bootstrap.Admin.Controllers.Api /// [HttpPost] [ButtonAuthorize(Url = "~/Admin/Profiles", Auth = "saveIcon")] - public async Task Post([FromServices]IHostingEnvironment env, IFormCollection files) + public async Task Post([FromServices]IWebHostEnvironment env, IFormCollection files) { var previewUrl = string.Empty; long fileSize = 0; @@ -128,4 +128,4 @@ namespace Bootstrap.Admin.Controllers.Api return ret; } } -} \ No newline at end of file +} diff --git a/src/admin/Bootstrap.Admin/HttpHeaderOperation.cs b/src/admin/Bootstrap.Admin/HttpHeaderOperation.cs index a782e2c6..d2da5ce6 100644 --- a/src/admin/Bootstrap.Admin/HttpHeaderOperation.cs +++ b/src/admin/Bootstrap.Admin/HttpHeaderOperation.cs @@ -1,35 +1,33 @@ -using Microsoft.AspNetCore.Authorization; -using Swashbuckle.AspNetCore.Swagger; -using Swashbuckle.AspNetCore.SwaggerGen; -using System.Collections.Generic; -using Operation = Swashbuckle.AspNetCore.Swagger.Operation; +//using Microsoft.AspNetCore.Authorization; +//using Microsoft.OpenApi.Models; +//using Swashbuckle.AspNetCore.SwaggerGen; +//using System.Collections.Generic; -namespace Bootstrap.Admin -{ - /// - /// - /// - public class HttpHeaderOperation : IOperationFilter - { - /// - /// - /// - /// - /// - public void Apply(Operation operation, OperationFilterContext context) - { - if (operation.Parameters == null) operation.Parameters = new List(); +//namespace Bootstrap.Admin +//{ +// /// +// /// +// /// +// public class HttpHeaderOperation : IOperationFilter +// { +// /// +// /// +// /// +// /// +// /// +// public void Apply(OpenApiOperation operation, OperationFilterContext context) +// { +// if (operation.Parameters == null) operation.Parameters = new List(); - if (context.MethodInfo.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Length == 0) - { - operation.Parameters.Add(new NonBodyParameter() - { - Name = "Authorization", //添加Authorization头部参数 - In = "header", - Type = "string", - Required = false - }); - } - } - } -} +// if (context.MethodInfo.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Length == 0) +// { +// operation.Parameters.Add(new OpenApiParameter() +// { +// Name = "Authorization", //添加Authorization头部参数 +// In = ParameterLocation.Header, +// Required = false +// }); +// } +// } +// } +//} diff --git a/src/admin/Bootstrap.Admin/Models/ProfilesModel.cs b/src/admin/Bootstrap.Admin/Models/ProfilesModel.cs index 42d7d8a6..ff2a4616 100644 --- a/src/admin/Bootstrap.Admin/Models/ProfilesModel.cs +++ b/src/admin/Bootstrap.Admin/Models/ProfilesModel.cs @@ -30,7 +30,7 @@ namespace Bootstrap.Admin.Models /// /// /// - public ProfilesModel(ControllerBase controller, IHostingEnvironment host) : base(controller) + public ProfilesModel(ControllerBase controller, IWebHostEnvironment host) : base(controller) { if (host != null) { diff --git a/src/admin/Bootstrap.Admin/Program.cs b/src/admin/Bootstrap.Admin/Program.cs index 7aec9ac7..ecf28057 100644 --- a/src/admin/Bootstrap.Admin/Program.cs +++ b/src/admin/Bootstrap.Admin/Program.cs @@ -1,5 +1,7 @@ -using Microsoft.AspNetCore; +using Bootstrap.DataAccess; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.DependencyInjection; namespace Bootstrap.Admin { @@ -14,14 +16,15 @@ namespace Bootstrap.Admin /// public static void Main(string[] args) { - CreateWebHostBuilder(args).Build().Run(); + CreateHostBuilder(args).Build().Run(); } /// /// /// /// /// - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args).UseSentry().UseStartup(); + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(builder => builder.UseStartup()); } } diff --git a/src/admin/Bootstrap.Admin/Startup.cs b/src/admin/Bootstrap.Admin/Startup.cs index 81ef602c..a80ce55b 100644 --- a/src/admin/Bootstrap.Admin/Startup.cs +++ b/src/admin/Bootstrap.Admin/Startup.cs @@ -1,20 +1,17 @@ using Bootstrap.DataAccess; using Longbow.Web; using Longbow.Web.SignalR; -using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; -using System.Text.Encodings.Web; -using System.Text.Unicode; namespace Bootstrap.Admin { @@ -44,47 +41,51 @@ namespace Bootstrap.Admin /// public void ConfigureServices(IServiceCollection services) { - services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); + //services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.Configure(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); + services.AddLogging(logging => logging.AddFileLogger().AddDBLogger(ExceptionsHelper.Log)); services.AddCors(); - services.AddLogging(builder => builder.AddFileLogger().AddDBLogger(ExceptionsHelper.Log)); services.AddConfigurationManager(); services.AddCacheManager(); services.AddDbAdapter(); services.AddIPLocator(DictHelper.ConfigIPLocator); services.AddOnlineUsers(); - services.AddSignalR().AddJsonProtocalDefault(); - services.AddSignalRExceptionFilterHandler((client, ex) => client.SendMessageBody(ex).ConfigureAwait(false)); + services.AddSignalR().AddNewtonsoftJsonProtocol(op => + { + op.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver(); + op.PayloadSerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + }); + services.AddSignalRExceptionFilterHandler(async (client, ex) => await client.SendMessageBody(ex).ConfigureAwait(false)); services.AddResponseCompression(); services.AddBootstrapAdminAuthentication().AddGitee(OAuthHelper.Configure).AddGitHub(OAuthHelper.Configure); - services.AddSwagger(); + services.AddAuthorization(options => options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireBootstrapAdminAuthorizate().Build()); + //services.AddSwagger(); services.AddButtonAuthorization(MenuHelper.AuthorizateButtons); services.AddBootstrapAdminBackgroundTask(); services.AddHttpClient(); services.AddAdminHealthChecks(); - services.AddMvc(options => + services.AddControllersWithViews(options => { - options.Filters.Add(); options.Filters.Add(); options.Filters.Add>(); - }).AddJsonOptions(options => + }).AddNewtonsoftJson(op => { - options.SerializerSettings.ContractResolver = new DefaultContractResolver(); - options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; - JsonConvert.DefaultSettings = () => options.SerializerSettings; - }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); - services.AddApiVersioning(option => - { - option.DefaultApiVersion = new ApiVersion(1, 0); - option.ReportApiVersions = true; - option.AssumeDefaultVersionWhenUnspecified = true; - option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version")); + op.SerializerSettings.ContractResolver = new DefaultContractResolver(); + op.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + JsonConvert.DefaultSettings = () => op.SerializerSettings; }); + //services.AddApiVersioning(option => + //{ + // option.DefaultApiVersion = new ApiVersion(1, 0); + // option.ReportApiVersions = true; + // option.AssumeDefaultVersionWhenUnspecified = true; + // option.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version")); + //}); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -93,7 +94,7 @@ namespace Bootstrap.Admin /// /// /// - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseForwardedHeaders(new ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.All }); if (env.IsDevelopment()) @@ -110,18 +111,21 @@ namespace Bootstrap.Admin app.UseHttpsRedirection(); app.UseResponseCompression(); app.UseStaticFiles(); + app.UseRouting(); app.UseAuthentication(); + app.UseAuthorization(); app.UseBootstrapAdminAuthorization(RoleHelper.RetrievesByUserName, RoleHelper.RetrievesByUrl, AppHelper.RetrievesByUserName); app.UseBootstrapHealthChecks(); app.UseOnlineUsers(TraceHelper.Filter, TraceHelper.Save); app.UseCacheManager(); - app.UseSignalR(routes => + //app.UseSwagger(Configuration["SwaggerPathBase"].TrimEnd('/')); + app.UseEndpoints(endpoints => { - routes.MapHub("/NotiHub"); - routes.MapHub("/TaskLogHub"); + endpoints.MapHub("/NotiHub"); + endpoints.MapHub("/TaskLogHub"); + endpoints.MapHealthChecks("/healths"); + endpoints.MapDefaultControllerRoute().RequireAuthorization(); }); - app.UseSwagger(Configuration["SwaggerPathBase"].TrimEnd('/')); - app.UseMvcWithDefaultRoute(); } } } diff --git a/src/admin/Bootstrap.Admin/SwaggerExtensions.cs b/src/admin/Bootstrap.Admin/SwaggerExtensions.cs index bd770dd0..d07e269e 100644 --- a/src/admin/Bootstrap.Admin/SwaggerExtensions.cs +++ b/src/admin/Bootstrap.Admin/SwaggerExtensions.cs @@ -1,58 +1,59 @@ -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Swashbuckle.AspNetCore.Swagger; -using System; -using System.IO; +//using Microsoft.AspNetCore.Authentication; +//using Microsoft.AspNetCore.Builder; +//using Microsoft.Extensions.DependencyInjection; +//using Microsoft.OpenApi.Models; +//using Swashbuckle.AspNetCore.Swagger; +//using System; +//using System.IO; -namespace Bootstrap.Admin -{ - /// - /// - /// - internal static class SwaggerExtensions - { - /// - /// - /// - /// - /// - public static void UseSwagger(this IApplicationBuilder app, string pathBase) - { - app.UseWhen(context => context.Request.Path.StartsWithSegments("/swagger"), builder => - { - builder.Use(async (context, next) => - { - if (!context.User.Identity.IsAuthenticated) await context.ChallengeAsync(); - else await next(); - }); - }); - app.UseSwagger(); - app.UseSwaggerUI(c => - { - c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", "BootstrapAdmin API V1"); - }); - } +//namespace Bootstrap.Admin +//{ +// /// +// /// +// /// +// internal static class SwaggerExtensions +// { +// /// +// /// +// /// +// /// +// /// +// public static void UseSwagger(this IApplicationBuilder app, string pathBase) +// { +// app.UseWhen(context => context.Request.Path.StartsWithSegments("/swagger"), builder => +// { +// builder.Use(async (context, next) => +// { +// if (!context.User.Identity.IsAuthenticated) await context.ChallengeAsync(); +// else await next(); +// }); +// }); +// app.UseSwagger(); +// app.UseSwaggerUI(c => +// { +// c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", "BootstrapAdmin API V1"); +// }); +// } - /// - /// - /// - /// - public static void AddSwagger(this IServiceCollection services) - { - services.AddSwaggerGen(options => - { - options.SwaggerDoc("v1", new Info - { - Version = "v1", - Title = "BootstrapAdmin API" - }); +// /// +// /// +// /// +// /// +// public static void AddSwagger(this IServiceCollection services) +// { +// services.AddSwaggerGen(options => +// { +// options.SwaggerDoc("v1", new OpenApiInfo +// { +// Version = "v1", +// Title = "BootstrapAdmin API" +// }); - //Set the comments path for the swagger json and ui. - var xmlPath = Path.Combine(AppContext.BaseDirectory, "Bootstrap.Admin.xml"); - options.IncludeXmlComments(xmlPath); - options.OperationFilter(); // 添加httpHeader参数 - }); - } - } -} +// //Set the comments path for the swagger json and ui. +// var xmlPath = Path.Combine(AppContext.BaseDirectory, "Bootstrap.Admin.xml"); +// options.IncludeXmlComments(xmlPath); +// options.OperationFilter(); // 添加httpHeader参数 +// }); +// } +// } +//} diff --git a/src/admin/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj b/src/admin/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj index 09b03c94..513c206c 100644 --- a/src/admin/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj +++ b/src/admin/Bootstrap.DataAccess/Bootstrap.DataAccess.csproj @@ -11,7 +11,6 @@ - diff --git a/test/UnitTest/UnitTest.csproj b/test/UnitTest/UnitTest.csproj index c9c08401..b06a8b20 100644 --- a/test/UnitTest/UnitTest.csproj +++ b/test/UnitTest/UnitTest.csproj @@ -1,7 +1,7 @@  - netcoreapp2.2 + netcoreapp3.0 false full @@ -11,7 +11,6 @@ all runtime; build; native; contentfiles; analyzers -