我有一些必须额外安全的管理页面,例如只能通过本地主机名和有限范围的IP访问。如何实现这一点而不是请求可以伪造?
答案 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(但即便如此,我认为这是一个很小的安全风险)。