MVC 中是否有一个属性可以将控制器操作限制为来自特定站点的帖子?

Is there an attribute in MVC to limit Controller Actions to posts from a specific site?

我有一个 ajax 调用用于启动从 SPA 到 MVC 应用程序中的控制器的 'forgot password' 进程,看起来像这样:

[HttpPost]
public JsonResult ResetPassword(User acct)
{
  ...
}

我希望有一种方法可以将此控制器限制为仅从该页面发帖。我想我可以写一个自定义属性,但我希望这是一个足够普遍的问题,有人已经做到了。是的,我意识到伪造 headers 以包含欺骗性引荐来源数据是可能的,但增加的安全层会让我更加放心。或者有人有更好的方法来完成同样的事情的建议吗?

感谢您的帮助!

您可以检查 HTTP 中的 referer header。这为您提供了发出请求的页面。

是的,您必须注意这并不安全,因为任何 HTTP header 都可以很容易地被欺骗。

简短的回答是你不能。如前所述,您可以尝试使用引荐来源 header (HttpRequest.Referrer),但由于多种原因它并不可靠:

  • 这不是必需的 header,
  • 您依赖呈现代理(例如,客户端浏览器)[诚实地]进行设置,并且
  • 可以更改。例如,如果请求被代理,它可以设置为代理 URL.

HttpRequest.UserHostAddress 可能更可靠一些。但同样,你不能真正依赖它:它是请求来自的 IP 地址,但同样,如果请求是代理的或通过防火墙的,你可能会得到代理地址,而不是实际的客户端IP地址。

最可靠的方法是通过证书实现客户端身份验证:

虽然有点麻烦:客户端必须提供正确的证书作为请求的一部分,服务器也必须具有匹配的证书。

我觉得你可以使用防伪令牌

http://kamranicus.com/blog/posts/70/protip-using-anti-forgery-token-with-aspnet-web-ap/