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

目录
  • 前言:
  • 一、IFeatureFilter介绍
  • 二、实现
  • 三、使用
  • 结论:

前言:

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

但其实我们使用了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" ]
            }
        }
        ]
    }
}

结论:

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

到此这篇关于ASP.NET Core使用功能开关控制路由访问操作(续)的文章就介绍到这了,更多相关ASP.NET Core使用功能开关控制路由访问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core中自定义路由约束的实现

    路由约束 ASP.NET Core中,通过定义路由模板,可以在Url上传递变量,同时可以针对变量提供默认值.可选和约束. 约束的使用方法是在属性路由上添加指定的约束名,用法如下: // 单个使用 [Route("users/{id:int}")] public User GetUserById(int id) { } // 组合使用 [Route("users/{id:int:min(1)}")] public User GetUserById(int id) {

  • ASP.NET Core3.1 Ocelot路由的实现

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制). Ocelot将一个请求路由到另一个请求.为了让Ocelot正常工作,您需要在配置中设置一个Route.下面我们就Ocelot基础项目构建简单介绍下路由功能. 2.Ocelot基础项目构建(APIGatewayBasicDemo) 现在我们根据GitHub贡献者开源项目来学

  • ASP.NET Core Razor 页面路由详解

    在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求.最简单的方法是将 URL 映射到磁盘上的物理文件,在 Razor 页面框架中,ASP.NET团队就是这样实现的. 关于 Razor 页面框架如何将 URL 与文件相匹配,有一些规则您必须了解,以及如何根据需要自定义规则改变输出的结果.如果您将 Razor 页面与 Web Form 框架进行比较,您还需要了解取代的 Ur l参数以及在URL中传递数据的机制. 规则一,Razor

  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopmen

  • ASP.NET Core使用功能开关控制路由访问操作

    目录 前言: 1.功能开关 3.实现 3.使用 结论: 前言: 在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(<ASP.NET Core使用Middleware设置有条件允许访问路由>). 而对于一些试验性的功能,我们并不希望用密码去控制是否允许访问,而是想用一种开关的方式开放. 1.功能开关 功能开关(Feature flags)就是这样一种部署技术,有助于提高应用程序的灵活性. 使用功能开关,你可以将新功能部署到生产环境中,但限制其可用性. 通过使用开关,你可以为控

  • ASP.NET Core使用Middleware设置有条件允许访问路由

    目录 1.简介 2.实现 1.简介 有时,我们可能在Web API中包含一些具有调试功能的请求.比如我们上次的文章中为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?使用的获取配置值的功能: endpoints.MapGet("/test2/{key:alpha}", async context => {     var key = context.Request.RouteValues["key"].ToStrin

  • Asp.net Core 如何设置黑白名单(路由限制)

    在原有的AspnetMvc中我们会使用到路由访问限制,在AppStart/RouteConfig.cs中写上如下: routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 但是在aspnet core mvc已经不存在RouteConfig.cs的这个给文件和这种写法,我们该如何在Aspnet core mvc中实现相同效果呢? 这里我们需要使用到的中间件时UrlFirewall 1)说明: UrlFirewall 是一个开源.轻便的对htt

  • ASP.NET Core自动生成小写破折号路由的实现方法

    默认情况下,ASP.NET Core使用如 http://localhost:5000/HomeIndex 类的大驼峰路由.但是如果想使用小写的路由,并且这些路由用破折号分隔:http://localhost:5000/home-index它们比较常见且一致. 举例.NET常见路由 http://localhost:5000/User/ListPages 想要的效果 http://localhost:5000/user/list-pages 1.如何生成小写的路由可以这样设置 services.

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

    目录 前言: 一.IFeatureFilter介绍 二.实现 三.使用 结论: 前言: 在前面的文章,我们介绍了​ ​使用功能开关控制路由访问​​. 但其实我们使用了2个条件做的判断: var isDebugEndpoint = context.Request.Path.Value.Contains("/test"); var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoin

  • ASP.NET Core中使用默认MVC路由的配置

    ASP.NET Core里Route这块的改动不大,只是一些用法上有了调整,提供了一些更加简洁的语法. 而对于自定义路由的支持当然也是没有问题的,这个功能应该是从MVC1.0版本就已经有这个功能. 先看看ASP.NET Core里面实现默认MVC路由的配置方式 通常情况下,在使用MVC项目的时候,默认的路由就足够了,就是常见的通过Controller和Action获取具体的方法的方式. 从一个最基本的项目开始,执行以下步骤,就可以使得项目支持MVC路由 1.创建一个空白的ASP.NET Core

  • ASP.NET Core中MVC模式实现路由二

    目录 1.URL生成 2.URL生成方式 2.1根据操作名称生成URL 2.2根据路由生成URL 2.3在HTML中生成URL 2.4在操作结果中生成URL 3.区域(Area) 4.实现IActionConstraint的路由约束 相关文章 ASP.NET Core中MVC模式实现路由一 ASP.NET Core中MVC模式实现路由二 1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由

  • asp.net core利用AccessControlHelper实现控制访问权限

    Intro# 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件,最初只是支持 netframework,后来 dotnetcore 2.0 发布了之后添加了对 asp.net core 的支持,在 dotnetcore 3.0 发布之后也增加了对 asp.net core 3.0 的支持(1.9.0及之后版本),目前对于 asp.net core 支持的更多一些,asp.net core 可以使用 TagHelper 来控制页面上元

  • ASP.NET Core中MVC模式实现路由一

    目录 1.前言 2.设置路由中间件 3.传统路由 4.多个路由 4.1定义多个路由 4.2区分操作 5.属性路由 5.1 属性路由 5.2 使用 Http[Verb] 属性的属性路由 5.3合并路由 5.4指定属性路由的可选参数.默认值和约束 5.4自定义属性路由 相关文章 ASP.NET Core中MVC模式实现路由一 ASP.NET Core中MVC模式实现路由二 1.前言 ASP.NET Core MVC使用路由中间件来匹配传入请求的URL并将它们映射到操作(Action方法).路由在启动

  • ASP.NET Core MVC学习教程之路由(Routing)

    前言 ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它在搜索引擎优化(SEO)和链接生成中运行良好,而不用关心Web服务器上的文件是怎么组织的.我们可以方便的使用路由模板语法定义路由,路由模板语法支持路由值约束,默认值和可选值. 基于约束的路由允许全局定义应用支持的URL格式,以及这些格式是怎样各自在给定的控制器中映射到指定的操作方法(Action

  • asp.net core项目mvc权限控制:分配权限

    前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Identity.EntityFrameworkCore框架进行权限分配. 在介绍分配方法之前,我们必须理解权限关系,这里面涉及到三个对象:用户,角色,权限,权限分配到角色,角色再分配到用户,当某个用户属于某个角色后,这个用户就具有了角色所包含的权限列表,比如现在有一个信息管理员角色,这个角色包含了信息删除权

随机推荐