ASP.NET核心限制对certian页面的访问

时间:2017-02-28 07:49:14

标签: c# security asp.net-core

我有一些必须额外安全的管理页面,例如只能通过本地主机名和有限范围的IP访问。如何实现这一点而不是请求可以伪造?

3 个答案:

答案 0 :(得分:1)

我通过授权过滤器解决了这个问题。它可能看起来很蹩脚,但它适用于我的项目(在防火墙后面的IIS上托管)

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var allowedHosts = "127.0.0.1,192.168.1.15";
        if (
            (allowedHosts.Contains("127.0.0.1")
            && context.HttpContext.Connection.RemoteIpAddress.ToString() == "127.0.0.1"
            && !string.IsNullOrEmpty(context.HttpContext.Request.Headers["X-Forwarded-For"]))
            ||
            (!(context.HttpContext.Request.Host.Host.Contains("localhost"))
            && !allowedHosts.Contains(context.HttpContext.Connection.RemoteIpAddress.ToString()))
            )
        {
            log();
            context.Result =new RedirectResult("/404");
        }
    }

答案 1 :(得分:1)

您检查了policies吗?

答案 2 :(得分:0)

也许你可以做这样的实现:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class LocalHostOnlyAttribute : Attribute, IAuthorizationFilter
{
    [Authorize]
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // restrict if hostname is not localhost.
        if(context.HttpContext.Request.Host.Host !="localhost"){
            // return UnauthorizedAccess razor page/view if not allowed.
            context.Result = new ViewResult() {ViewName = "UnauthorizedAccess" };
        }
    }
}

请注意,我不确定这是否容易被欺骗,因此可能会产生安全风险。

特别是当你的请求是从nginx或其他反向代理中提出来的时候。主持人将永远是localhost

也许检查请求ip等于服务器的IP(但即便如此,我认为这是一个很小的安全风险)。