Asp.net core 授权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 =>

我是ASP.NET核心的新手,我有一个控制器,我只需要在我的机器上授权它,用于测试目的,但是,在其他

我有以下配置:

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);