ASP.NET Core使用功能开关控制路由访问(续)

前言

在前面的文章,我们介绍了使用功能开关控制路由访问。

但其实我们使用了2个条件做的判断:

var isDebugEndpoint = context.Request.Path.Value.Contains("/test");
var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");if (isDebugEndpoint && debugEndpoint)

如果仅用功能开关来控制:

var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");if (debugEndpoint)

这样是不是更符合功能开关的含义呢!

IFeatureFilter介绍

IFeatureFilter(功能过滤器)可用于确定是否满足某些条件以启用一项功能。

功能过滤器可以自由使用任何可用的标准,例如流程状态或请求内容。

可以为给定功能注册功能过滤器,如果任何特征过滤器评估为真,该特征将被考虑启用。

在本文,我们可以判断当前路由地址是否为调试地址,让评估返回真。

实现

自定义功能过滤器实现代码如下:

public class DebugFeatureSettings
{public string[] DebugEndpoints { get; set; }
}[FilterAlias("DebugFeatureFilter")]
public class DebugFeatureFilter : IFeatureFilter
{private readonly IHttpContextAccessor _httpContextAccessor;public DebugFeatureFilter(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor;}public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context){var settings = context.Parameters.Get<DebugFeatureSettings>();foreach (var endPoint in settings.DebugEndpoints){var isDebugEndpoint = _httpContextAccessor.HttpContext.Request.Path.Value.Contains(endPoint);return Task.FromResult(isDebugEndpoint);}return Task.FromResult(false);}
}

我们注入了IHttpContextAccessor,用于获取当前请求上下文,然后判断当前路由地址是否包含DebugEndpoints配置的值。

使用

修改我们上次实现的DebugMiddleware

public class DebugMiddleware : IMiddleware
{private readonly IFeatureManager _featureManager;public DebugMiddleware(IFeatureManager featureManager){_featureManager = featureManager;}public async Task InvokeAsync(HttpContext context, RequestDelegate next){var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");if (debugEndpoint){context.SetEndpoint(new Endpoint((context) =>{context.Response.StatusCode = StatusCodes.Status403Forbidden;return Task.CompletedTask;},EndpointMetadataCollection.Empty,"无权访问"));}await next(context);}
}

然后将配置修改为如下形式:

"FeatureManagement": {"ForbiddenDebugEndpoint": {"EnabledFor": [{"Name": "DebugFeatureFilter","Parameters": {"DebugEndpoints": [ "/test" ]}}]}
}

结论

运行后我们发现,只有符合功能开关设置的路由地址才会被限制访问:

8b487fb1df1faf2e9ca7a1e2fbe05e71.gif

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用CDR智能填充工具

使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓。与其他填充工具不同&#xff0c;智能填充工具仅填充对象&#xff0c;它检测到区域的边缘并创建一个闭合路径&#xff0c;因此可以填充区域。例如&#xff0c;智能填充工具可以检测多个对象相交产生的闭合区域&#xf…

java对象引用出错_“Java有值传递和引用传递”为什么错了?

前言初学Java的时候&#xff0c;老师在课堂上说“Java有值传递和引用传递”&#xff0c;但网上“Java只有值传递”的呼声很高。本人在查找资料的过程中&#xff0c;在这两个说法之间反复横跳。经过本人的整理后&#xff0c;其实还真的是Java只有值传递。什么是值传递&#xff1…

试图加载格式不正确的程序

部署IIS的时候&#xff0c;会出现 System.BadImageFormatException: Could not load file or assembly xxx or one of its dependencies. 试图加载格式不正确的程序。 问题分析&#xff1a; 由于编译中有的是32位有的是64位 不一致 解决办法&#xff1a; 1.找到IIS该站点对应的…

LeetCode之Missing Number

1、题目 Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array. For example, Given nums [0, 1, 3] return 2. Given nums [0]return 12、代码实现 public class Solution {public int missingNumber(in…

Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程

只要结束进程中的 “dllhost" 进程就好了。 估计原因是&#xff0c; 当卸载某些 "所谓的"较大型的软件的时候&#xff0c; 要去更新&#xff0c; 更改系统对dll链接库的注册&#xff0c; 更新。 通常这个过程等待的时间较长&#xff0c; 或者需要重新启动电脑才…

程序员生存之道-教你如何在丛林中捕获食物

文章目录 &#x1f4a5; 序言&#x1f423; 躺&#x1f95d; 从零到一还是从零到100&#xff1f;&#x1f344; 螺丝钉文化&#x1f354; 价值分析&#x1f353; 长期主义者&#xff1f;&#x1f96c; 何为顺其自然&#xff1f;&#x1f308; 总结 &#x1f4a5; 序言 嗨&#…

微软发文庆祝 .NET 诞生 20 周年纪念日!

技术编辑&#xff1a;MissD丨发自 思否编辑部公众号&#xff1a;SegmentFault刚刚过去的“情人节”里&#xff0c;.NET 团队为庆祝 .NET 社区诞生 20 周年而举办了一场盛大的活动。没错&#xff01;.NET 于 2002 年 2 月 13 日与 Visual-Studio 一起推出&#xff0c;本月终于迎…

java代码实现四舍五入_Java中四舍五入实现方法

Java中四舍五入实现方法Java有四舍五入函数–Math.round&#xff0c;通过一个例子看看他的用法&#xff1a;[java] view plaincopypackage math;public class MathRoundTest {/*** Math类中提供了三个与取整有关的方法&#xff1a;ceil,floor,round,* 这些方法的作用于它们的英…

【动态规划】[Uva11270]Tiling Dominoes

这道题就是连通性状态压缩DP&#xff0c;复习了一下。 #include <cstdio> #include <iostream> #include <cstring> #include <map> using namespace std; long long dp[11][11][(1<<11)1][2], n, m; long long dfs(int x, int y, int md, int r…

LeetCode之Find All Numbers Disappeared in an Array

1、题目 Given an array of integers where 1 ≤ a[i] ≤ n (n size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this array. Could you do it without extra space and in O(n) runti…

根据文件扩展名得到文件对应该类型Icon方法

2019独角兽企业重金招聘Python工程师标准>>> 根据文件扩展名得到文件对应该类型Icon方法 package com.fleety.util; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.…

Asp-Net-Core开发笔记:在docker部署时遇到一个小坑

哦吼之前刚说了尝试了使用docker来部署AspNetCore应用&#xff08;Asp.Net Core部署&#xff1a;早知道&#xff0c;还是docker!以及一点碎碎念&#xff09;&#xff0c;结果这才刚上班就遇到问题了 …我这项目用的数据库是Oracle&#xff0c;之前直接运行没啥问题&#xff0c;…

lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2

4.2 平均精确率减少 Mean decrease accuracy另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序&#xff0c;并且度量顺序变动对模型的精确率的影响。很明显&#xff0c;对于不重要的变量来说&#xff0c;打乱顺序对模型的精…

shell中条件判断if中的-z到-d的意思

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真。 [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。 [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。 [ -d FILE ] 如果 FILE 存在且是一个目录则为真。 [ -e FILE ] 如果 FILE 存在则为真。…

Mac Generating Pods project Abort trap: 6

为什么80%的码农都做不了架构师&#xff1f;>>> 为项目添加cocoapods如果产生此种错误时,主要有以下几点原因: 1,cocoapods版本过低: 打开终端在终端输入:pod --version,目前最新版本是1.2.0(2017年3月),如果发现版本过低,则可以在终端输入以下命令:gem install co…

svn 服务器搭建

2019独角兽企业重金招聘Python工程师标准>>> Svn搭建 1. Linux 搭建 YUM 服务器 [rootlocalhost conf]# yum install -y subversion 2.验证安装版本&#xff1a; [rootlocalhost conf]# svnserve –version 3.创建SVN 版本库 [rootlocalhost conf]# mkdir /v…

Android之提示can‘t execute: Permission denied解决办法

1、问题 在手机里面执行文件的时候提示 cant execute: Permission denied 一开始以为是没有root权限&#xff0c;自己傻逼了&#xff0c;错误意思是&#xff0c;不能执行&#xff0c;权限定义&#xff0c; 2、解决办法 chmod 777 file 给文件可执行就可以。 一般把文件放到…

C# 使用 ValueTasks

C# 7 带有更灵活的 await 关键字&#xff1b;它现在可以等待任何提供 GetAwaiter 方法的对象。一种可用于等待的新类型是 ValueTask。与 Task 类相反&#xff0c;ValueTask 是一个结构。这具有性能优势&#xff0c;因为 ValueTask 在堆上没有对象。与异步方法调用相比&#xff…

LeetCode之Reverse String II

1、题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or …

Electron - 创建跨平台的桌面客户的应用程序

Electron 框架的前身是 Atom Shell&#xff0c;可以让你写使用 JavaScript&#xff0c;HTML 和 CSS 构建跨平台的桌面应用程序。它是基于io.js 和 Chromium 开源项目&#xff0c;并用于在 Atom 编辑器中。Electron 是开源的&#xff0c;由 GitHub 维护&#xff0c;有一个活跃的…