仅接受ASP.Net Core 2.1 MVC中的本地请求

sch*_*nyw 5 c# asp.net-core-mvc asp.net-core

我有一个简单的ASP.Net Core 2.1 MVC应用程序,并且在其中一个控制器中,我想实现一个仅接受本地请求的操作(即,请求源自127.0.0.1,或者来自与服务器IP相同的地址) 。

我一直在ASP.Net Core中寻找适合此目的的筛选器,但似乎找不到。我可以使用AuthorizeAttribute,例如[Authorize(Policy = "LocalOnly")]

并在启动中的ConfigureServices中注册相应的策略:

services.AddAuthorization(options =>
{
    options.AddPolicy("LocalOnly", policy =>
    {
        policy.RequireAssertion(context =>
        {
            if (context.Resource is AuthorizationFilterContext mvcContext)
            {
                return mvcContext.HttpContext.Request.IsLocal();
            }
            return false;
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

IsLocal()的扩展方法在哪里HttpRequest

但是我认为这不是正确的方法-我试图做的实际上不是授权,并且由于我的程序中没有身份验证,因此产生的错误也不正确。

是否有一种简单合法的方法来做我想要的过滤器?还是这实际上应该在控制器的动作逻辑中完成?还是整个检查本地请求的想法不是很正确?

非常感谢您的帮助。

Tse*_*eng 3

将其作为 ASP.NET Core 中间件来实现。

在最简单的情况下使用app.Use(...)方法。

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            if (!context.Request.IsLocal())
            {
                // Forbidden http status code
                context.Response.StatusCode = 403;
                return;
            }

            await next.Invoke();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

委托调用返回本地请求,在此处停止中间件管道。

但我不能 100% 确定您要存档的内容。

您是否希望该服务只能从您的内部网络调用?更简单的方法是使用 docker 容器,将需要相互通信的服务添加到同一网络,并且仅将真正需要与外界通信的应用程序暴露给容器外部。