Asp.net core 授权ASP.NET核心中的本地主机
我是ASP.NET核心的新手,我有一个控制器,我只需要在我的机器上授权它,用于测试目的,但是,在其他 我有以下配置:Asp.net core 授权ASP.NET核心中的本地主机,asp.net-core,asp.net-core-2.2,Asp.net Core,Asp.net Core 2.2,我是ASP.NET核心的新手,我有一个控制器,我只需要在我的机器上授权它,用于测试目的,但是,在其他 我有以下配置: public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddMvc().AddJsonOptions(options =>
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.DateFormatString= "yyyy-MM-ddTHH:mm:ssZ";
});
services.AddAuthentication("Cookie")
.AddScheme<CookieAuthenticationOptions, CookieAuthenticationHandler>("Cookie", null);
services.AddLogging(builder => { builder.AddSerilog(dispose: true); });
是否有一种方法允许我的本地机器自动访问控制器的操作?类似于
[Authorize(Allow=localhost)]
您可以创建如下操作筛选器:
public类LocalhostAttribute:ActionFilterAttribute
{
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
var ip=context.HttpContext.Connection.RemoteIpAddress;
如果(!IPAddress.IsLoopback(ip)){
context.Result=新的UnauthorizedResult();
返回;
}
base.OnActionExecuting(上下文);
}
}
然后使用标记Localhost
:
/[授权]
[本地主机]
公共类OrderController:Controller
我相信这会起作用,限制对执行它的机器的访问。这更像是白名单而不是授权。授权意味着检查用户是否有做某事的权限。要做到这一点,必须首先识别用户,即进行身份验证 文档中的文章展示了如何通过中间件、操作过滤器或Razor页面过滤器实现IP安全列表 应用程序范围的中间件 中间件选项适用于整个应用程序。示例代码检索请求的端点IP,对照安全ID列表对其进行检查,并且仅当调用来自“安全”列表时才允许调用继续。否则,它将返回预定的错误代码,在本例中为401:
public async Task Invoke(HttpContext context)
{
if (context.Request.Method != "GET")
{
var remoteIp = context.Connection.RemoteIpAddress;
_logger.LogDebug("Request from Remote IP address: {RemoteIp}", remoteIp);
string[] ip = _adminSafeList.Split(';');
var bytes = remoteIp.GetAddressBytes();
var badIp = true;
foreach (var address in ip)
{
var testIp = IPAddress.Parse(address);
if(testIp.GetAddressBytes().SequenceEqual(bytes))
{
badIp = false;
break;
}
}
if(badIp)
{
_logger.LogInformation(
"Forbidden Request from Remote IP address: {RemoteIp}", remoteIp);
context.Response.StatusCode = 401;
return;
}
}
await _next.Invoke(context);
}
本文展示了在UseMvc()
之前注册它,这意味着在到达MVC中间件之前请求将被拒绝:
app.UseMiddleware<AdminSafeListMiddleware>(Configuration["AdminSafeList"]);
app.UseMvc();
app.UseMiddleware(配置[“AdminSafeList]”);
app.UseMvc();
这样我们就不会浪费CPU时间来路由和处理无论如何都会被拒绝的请求。中间件选项也是实现黑名单的好选择
动作过滤器
过滤代码本质上是相同的,这次是在从ActionFilterAttribute派生的类中定义的。筛选器定义为作用域服务:
services.AddScoped<ClientIpCheckFilter>();
services.AddMvc(options =>
{
options.Filters.Add
(new ClientIpCheckPageFilter
(_loggerFactory, Configuration));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.addScope();
services.AddMvc(选项=>
{
options.Filters.Add
(新客户端检查页面过滤器
(_loggerFactory,Configuration));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
在这种情况下,请求将在被接受或拒绝之前到达MVC基础设施
剃须刀页面过滤器
代码还是一样的,这次是从IPageFilter派生的,这不是授权,而是IP限制。除非您的意思是“仅当连接来自此IP时,我想允许此已通过身份验证的用户调用
OrderController
”。通过将IP用作另一个声明,这也是可能的。授权意味着检查用户是否有做某事的权限。身份验证实际上是找出用户是谁。我需要一个已识别的用户,以及仅来自我的计算机(本地主机)的用户被授权执行控制器的操作。这在文档中提供并解释。示例中的配置设置甚至被称为SafeAdminList
,只有当[Authorize]
被注释掉时,它才能工作(代码202)。。。当然不是我得到的401@Serge,很高兴我能提供帮助,因为Panagiotis Kanavos评论说,Authorize
用于用户访问,所以理论上,如果用户经过身份验证,它应该可以工作,尝试测试一下,您也可以在特定的控制器方法中使用它。这些方法似乎与控制器上的“Authorize”属性不兼容。。。如果存在授权,则本地主机上的操作为denyied 401。。。
services.AddScoped<ClientIpCheckFilter>();
services.AddMvc(options =>
{
options.Filters.Add
(new ClientIpCheckPageFilter
(_loggerFactory, Configuration));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);