一. 前言
UrlFirewall 是一个开源, 轻便的对 http 请求进行过滤的中间件, 可使用在 webapi 或者网关(比如 Ocelot), 由我本人编写, 并且开源在 github: https://github.com/stulzq/UrlFirewall 欢迎 star.
二. UrlFirewall 介绍
UrlFirewall 是一款 http 请求过滤中间件, 可以和网关 (Ocelot) 搭配, 实现屏蔽外网访问内部接口, 只让内部接口之间相互通讯, 而不暴露到外部. 它支持黑名单模式和白名单模式, 支持自定义 http 请求响应代码. 具有良好的扩展性, 可自己实现验证逻辑, 从数据库或者 Redis 缓存等介质实现对规则的检索.
三. 使用
1. 从 Nuget 添加组件到你的 ASP.NET Core 项目
Install-Package UrlFirewall.AspNetCore
2. 配置 DI
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddUrlFirewall(options =>
- {
- options.RuleType = UrlFirewallRuleType.Black;
- options.SetRuleList(Configuration.GetSection("UrlBlackList"));
- options.StatusCode = HttpStatusCode.NotFound;
- });
- services.AddMvc();
- //...
- }
3. 配置中间件
UrlFirewall 中间件的位置必须放在第一个
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- //Configure url firewall middleware. Top most.
- app.UseUrlFirewall();
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- app.UseMvc();
- }
4. 配置规则
根据步骤 2, 使用的 Section 名称. UrlBlackList. 我们在 appsettings.json/appsettings.Devolopment.json 文件中添加以下配置;
- {
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
- }
- },
- "UrlBlackList": [
- {
- "Url": "/api/cart/add",
- "Method": "All"
- },
- {
- "Url": "/api/cart/del",
- "Method": "Post"
- },
- {
- "Url": "/api/cart/list",
- "Method": "Get"
- },
- {
- "Url": "/api/product/*",
- "Method": "All"
- }
- ]
- }
Url 字段表示要拦截的 http 请求 url, 支持通配符 * 和?,* 表示匹配任意个数任意字符,? 表示匹配一个任意字符. Method 表示 http 请求方法, All 代表所有, 还有
- Get Post Delete Put
- .
四. 扩展
如果你想要实现自己的验证逻辑, 或者从数据库, Redis 缓存等介质查询, 获取数据来进行验证; 你可以实现
IUrlFirewallValidator
接口, 然后调用
AddUrlFirewallValidator
方法替换默认实现即可.
示例:
- services.AddUrlFirewall(options =>
- {
- options.RuleType = UrlFirewallRuleType.Black;
- options.SetRuleList(Configuration.GetSection("UrlBlackList"));
- options.StatusCode = HttpStatusCode.NotFound;
- }).AddUrlFirewallValidator<CustomValidator>();
五. 地址
源码和 Demo: https://github.com/stulzq/UrlFirewall
来源: https://www.cnblogs.com/stulzq/p/8987632.html