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?
但是我认为这不是正确的方法-我试图做的实际上不是授权,并且由于我的程序中没有身份验证,因此产生的错误也不正确。
是否有一种简单合法的方法来做我想要的过滤器?还是这实际上应该在控制器的动作逻辑中完成?还是整个检查本地请求的想法不是很正确?
非常感谢您的帮助。
将其作为 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 容器,将需要相互通信的服务添加到同一网络,并且仅将真正需要与外界通信的应用程序暴露给容器外部。