当前位置:网站首页>.NET自定义中间件
.NET自定义中间件
2022-08-11 03:48:00 【JDBogdan】
/**
* 1.鉴权拓展类
*/
public static class CustomAuthenticationAppBuilderExtensions
{
public static IApplicationBuilder UseCustomAuthentication(this IApplicationBuilder app, IConfiguration configuration)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
var authServerAuthority = configuration["AuthServer:Authority"];
return authServerAuthority.Contains("uihcloud.cn")
? app.UseAuthentication().UseMiddleware<CustomAuthenticationMiddleware>()
: app.UseAuthentication();
}
}
/**
* 1.自定义鉴权中间件
*/
public class CustomAuthenticationMiddleware
{
private readonly RequestDelegate _next;
private readonly IdentityUserManager _identityUserManager;
private readonly IUserService _uapUserService;
public CustomAuthenticationMiddleware(RequestDelegate next, IdentityUserManager identityUserManager, IUserService uapUserService)
{
_next = next ?? throw new ArgumentNullException(nameof(next));
_identityUserManager = identityUserManager ?? throw new ArgumentNullException(nameof(identityUserManager));
_uapUserService = uapUserService ?? throw new ArgumentNullException(nameof(uapUserService));
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Headers.TryGetValue("Authorization", out var authorization))
{
var token = authorization.ToString().Replace(JwtBearerDefaults.AuthenticationScheme, "").Trim();
try
{
var claims = await GetClaimsAsync(token);
var claimsIdentity = new ClaimsIdentity(claims);
context.User = new ClaimsPrincipal(claimsIdentity);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
await _next(context);
}
private async Task<IEnumerable<Claim>> GetClaimsAsync(string token)
{
var authorization = $"{JwtBearerDefaults.AuthenticationScheme} {token}";
var uapUserInfo = await _uapUserService.GetUserInfoAsync(authorization);
var identityUser = await _identityUserManager.FindByNameAsync(uapUserInfo.Name);
return identityUser == null
? new List<Claim>()
: new List<Claim>
{
new(AbpClaimTypes.UserId, $"{identityUser.Id}"),
new(AbpClaimTypes.UserName, $"{uapUserInfo.UserName}"),
new(AbpClaimTypes.Name, $"{uapUserInfo.Name}"),
new(AbpClaimTypes.SurName, $"{identityUser.Surname}"),
new(AbpClaimTypes.PhoneNumber, $"{uapUserInfo.UserPhone}"),
new(AbpClaimTypes.Email, $"{uapUserInfo.UserEmail}"),
new(AbpClaimTypes.TenantId, $"{identityUser.TenantId}"),
new("appId", $"{uapUserInfo.AppId}"),
new("exp", $"{uapUserInfo.Exp}"),
new("iat", $"{uapUserInfo.Iat}")
}.WhereNotNull().ToList();
}
}
=========================================================================================
/**
* 1.授权拓展类
*/
public static class CustomAuthorizationAppBuilderExtensions
{
public static IApplicationBuilder UseCustomAuthorization(this IApplicationBuilder app, IConfiguration configuration)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
var authServerAuthority = configuration["AuthServer:Authority"];
return authServerAuthority.Contains("uihcloud.cn")
? app.UseAuthorization().UseMiddleware<CustomAuthorizationMiddleware>()
: app.UseAuthorization();
}
}
/**
* 1.自定义授权中间件
*/
public class CustomAuthorizationMiddleware
{
private readonly RequestDelegate _next;
private readonly IConfiguration _configuration;
public CustomAuthorizationMiddleware(RequestDelegate next, IConfiguration configuration)
{
_next = next ?? throw new ArgumentNullException(nameof(next));
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
}
public async Task Invoke(HttpContext context)
{
if (context.User.Claims.Any() == false)
{
await _next(context);
return;
}
try
{
//var appId = context.User.Claims.FirstOrDefault(_ => _.Type == "appId")?.Value;
//var redisConfiguration = _configuration["Redis:Configuration"];
//using var redis = await ConnectionMultiplexer.ConnectAsync(redisConfiguration);
//var db = redis.GetDatabase();
//var token = db.HashGet("5fb9ed690816442cad2e18e5a769fe06", appId).ToString();
}
catch (Exception e)
{
Console.WriteLine($"Authorization failed {e.Message}");
return;
}
await _next(context);
}
}
=========================================================================================
/**
* 1.自定义授权策略中间件
*/
public static class CustomEndpointsAppBuilderExtensions
{
public static IApplicationBuilder UseCustomEndpoints(this IApplicationBuilder app, IConfiguration configuration)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
var authServerAuthority = configuration["AuthServer:Authority"];
return authServerAuthority.Contains("uihcloud.cn")
? app.UseEndpoints(options =>
{
options.MapControllers().RequireAuthorization("ApiScope");
})
: app.UseEndpoints(options =>
{
options.MapControllers();
});
}
}
=========================================================================================
/**
* 使用
*/
[DependsOn(
typeof(BookHttpApiModule),
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(BookApplicationModule),
typeof(BookEntityFrameworkCoreDbMigrationsModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule),
typeof(AbpBlobStoringMinioModule),
typeof(AbpEventBusRabbitMqModule),
typeof(AbpBackgroundJobsQuartzModule)
)]
public class BookHttpApiHostModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
PreConfigure<AbpQuartzOptions>(options =>
{
options.Configurator = configure =>
{
configure.UsePersistentStore(storeOptions =>
{
storeOptions.UseProperties = false;
storeOptions.UseJsonSerializer();
storeOptions.UsePostgres(configuration.GetConnectionString(QuartzDbProperties.ConnectionStringName));
});
};
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var hostingEnvironment = context.Services.GetHostingEnvironment();
ConfigureMaxRequestBodySize();
ConfigureAuthorization(context);
ConfigureConventionalControllers();
ConfigureAuthentication(context, configuration);
ConfigureLocalization();
ConfigureCache(configuration);
ConfigureVirtualFileSystem(context);
ConfigureCors(context, configuration);
ConfigureSwaggerServices(context, configuration);
ConfigureAuditLog();
ConfigureMinio(configuration)
context.Services.AddHttpContextAccessor();
}
private void ConfigureMinio(IConfiguration configuration)
{
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureAll((containerName, containerConfiguration) =>
{
containerConfiguration.UseMinio(minio =>
{
minio.EndPoint = configuration["EndPoint"];
minio.AccessKey = configuration["AccessKey"];
minio.SecretKey = configuration["SecretKey"];
minio.BucketName = configuration["BucketName"];
});
});
});
}
private void ConfigureAuditLog()
{
Configure<AbpAuditingOptions>(options =>
{
options.IsEnabled = true;
options.ApplicationName = "book";
options.EntityHistorySelectors.AddAllEntities();
});
}
private void ConfigureMaxRequestBodySize()
{
Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = 1258291200;
});
Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = 1258291200;
});
//解决Multipart body length limit 134217728 exceeded
Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MultipartBodyLengthLimit = int.MaxValue;
options.MemoryBufferThreshold = int.MaxValue;
});
}
private void ConfigureCache(IConfiguration configuration)
{
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "Book:"; });
}
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<AbpModule>(
Path.Combine(hostingEnvironment.ContentRootPath,
$"..{Path.DirectorySeparatorChar}Book.Domain.Shared"));
}
}
private void ConfigureConventionalControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookApplicationModule).Assembly);
});
}
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
var authority = configuration["AuthServer:Authority"];
options.Authority = authority;
options.RequireHttpsMetadata = authority.StartsWith("https://");
options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false };
});
}
private void ConfigureAuthorization(ServiceConfigurationContext context)
{
context.Services.AddAuthorization(options =>
{
options.AddPolicy("ApiScope", builder =>
{
builder.RequireClaim(ClaimTypes.NameIdentifier);
});
});
}
private void ConfigureLocalization()
{
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
});
}
private void ConfigureRedis(ServiceConfigurationContext context, IConfiguration configuration)
{
if (configuration["ASPNETCORE_ENVIRONMENT"] != "Development")
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "Book-Protection-Keys");
}
}
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddCors(options =>
{
options.AddPolicy("Default", builder =>
{
builder
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Book API", Version = "v1" });
options.DocInclusionPredicate((_, _) => true);
options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme
{
Name = "Authorization",
Description = "Specify the authorization token.",
Scheme = JwtBearerDefaults.AuthenticationScheme,
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = JwtBearerDefaults.AuthenticationScheme
}
},
Array.Empty<string>()
}
});
});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
var cfg = context.GetConfiguration();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var supportedCultures = new[]
{
new CultureInfo("zh-Hans"),
new CultureInfo("en"),
};
app.UseAbpRequestLocalization(options =>
{
options.DefaultRequestCulture = new RequestCulture("zh-Hans");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
});
if (!env.IsDevelopment())
{
app.UseErrorPage();
}
app.UseCorrelationId();
app.UseVirtualFiles();
app.UseRouting();
app.UseCors("Default");
app.UseSignalrAuthorization();
app.UseCustomAuthentication(cfg);
app.UseCustomAuthorization(cfg);
app.UseCustomEndpoints(cfg);
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Book API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
}
}
边栏推荐
- 分布式和集群的区别和联系
- QueryDet:级联稀疏query加速高分辨率下的小目标检测
- 常用认证机制
- The impact of programmatic trading and subjective trading on the profit curve!
- 电力机柜数据监测RTU
- 高度塌陷问题的解决办法
- A large horse carries 2 stone of grain, a middle horse carries 1 stone of grain, and two ponies carry one stone of grain. It takes 100 horses to carry 100 stone of grain. How to distribute it?
- Echart地图的省级,以及所有地市级下载与使用
- MYSQLg高级------回表
- 机器学习可以应用在哪些场景?机器学习有什么用?
猜你喜欢
LeetCode刷题第16天之《239滑动窗口最大值》
[FPGA] day19- binary to decimal (BCD code)
Differences and connections between distributed and clustered
阿里低代码框架 lowcode-engine 之自定义物料篇
EasyCVR接入GB28181设备时,设备接入正常但视频无法播放是什么原因?
互换性测量与技术——偏差与公差的计算,公差图的绘制,配合与公差等级的选择方法
二叉树相关代码题【较全】C语言
UNI-APP_iphone bottom safe area
Environment configuration of ESP32 (arduino arduino2.0 VScode platform which is easy to use?)
Design and Realization of Employment Management System in Colleges and Universities
随机推荐
树莓派入门(5)系统备份
uni-app - 获取汉字拼音首字母(根据中文获取拼音首字母)
机器学习中什么是集成学习?
EasyCVR接入GB28181设备时,设备接入正常但视频无法播放是什么原因?
获取链表长度
互换性测量与技术——偏差与公差的计算,公差图的绘制,配合与公差等级的选择方法
程序化交易的策略类型可以分为哪几种?
程序化交易与主观交易对盈利曲线的影响!
LeetCode814算题第15天二叉树系列值《814 二叉树剪枝》
Environment configuration of ESP32 (arduino arduino2.0 VScode platform which is easy to use?)
【FPGA】设计思路——I2C协议
[ADI low-power 2k code] Based on ADuCM4050, ADXL363, TMP75 acceleration, temperature detection and serial port printing, buzzer playing music (lone warrior)
Power Cabinet Data Monitoring RTU
Binary tree related code questions [more complete] C language
2022-08-10 第六小组 瞒春 学习笔记
Leetcode 669. 修剪二叉搜索树
AI + medical: for medical image recognition using neural network analysis
The FTP error code list
高度塌陷问题的解决办法
机器学习可以应用在哪些场景?机器学习有什么用?