如何限制MVC控制器动作只能由服务器调用?

时间:2014-08-07 14:49:05

标签: asp.net-mvc asp.net-mvc-4

我的网站托管在共享的Windows服务器上,因此我无法创建Windows计划任务。 但我可以创建一些CRON作业,可以调用脚本/页面llike MVC操作。但我不希望任何人打电话给他们。

如何禁止将操作URL调用到我的服务器上的每个人?

更新: 我想结合Erik Funkenbusch和Allen King的答案可以解决问题(测试Request.IsLocal +传递"密码"参数)。

3 个答案:

答案 0 :(得分:0)

为方便起见,只需将您的功能设为私有或使用动作过滤。

答案 1 :(得分:0)

你想要的是为你的特殊网址创建一个特殊的路线..最好是在他们自己的控制器或区域,这样你就可以简单地将需要保护的所有东西放在一个地方并使用一条路线。

一种简单的方法是创建一个仅测试Request.IsLocal属性的自定义AuthorizeAttribute,然后使用该属性修饰方法或控制器。做这样的事情:

Custom Attributes on ActionResult

但请改用Request.IsLocal。

另一种方法是将RouteConstraint用于自定义Url,但实现起来可能会有点复杂。

答案 2 :(得分:0)

一个肮脏的技巧可能是传递参数并与固定的东西进行比较。外面的来电者不会知道这个价值。

像这样(VB):

function myAction(byval key as string, .....) as actionresult
    if key <> "<something only i know>" then return nothing  'this could the very first line

    ' this something only you know can be stored in Web.config and read using AppSettings
    ' so you don't need to hardcode anything in the code
end function

最简单的解决方案。

如果您不想在代码或Web.config中使用硬编码密钥,则还可以在会话启动时生成随机数并缓存该随机数。在密钥和第一行中传递该随机数,而不是检查硬编码值,从myAction中的缓存(可能是httpSession)读取并进行比较。这样就没有钥匙泄漏给公众的危险。只是因为有人没有运行计数器来调用该函数,你可以在生成的随机数前加上一些文本,例如“XTT - ”。