使用带有ASP.NET MVC AuthorizeAttribute的IIS 7.5预热模块

时间:2011-02-21 20:32:42

标签: asp.net-mvc iis asp.net-mvc-3 iis-7.5

我在ASP.NET MVC应用程序中创建了一个控制器来处理应用程序预热/初始化(即Web服务客户端代理的初始加载以及最初可能花费大量时间的其他操作)。要调用WarmUp控制器,我使用IIS 7 / 7.5预热模块在应用程序池启动时发送请求。

我不希望所有用户都能够执行WarmUp控制器操作,因此我使用[Authorize]属性修饰了控制器。我甚至在我的域中创建了一个组,其中包含应该被允许执行预热操作的用户,并将该组添加为authorize属性的角色(即[Authorize(Roles = @"MyDomain\AppWarmUp")])。

如果我使用Web浏览器手动调用WarmUp控制器并提供正确的凭据,则一切都按预期工作。但是,在使用IIS预热模块时,即使我提供了正确的凭据,我也会在应用程序事件日志中看到警告,指出身份验证失败。

如果我只为预热模块的用户上下文指定一个类型和用户名,我会收到一条带有消息的ProviderException

  

仅当用户名参数与当前Windows标识中的用户名匹配时,才支持方法。

如果我同时指定了用户名和密码/令牌,我会收到ArgumentException,其中包含以下消息:

  

用于模拟的令牌无效 - 无法复制。

如果我从控制器中删除了[Authorize]属性,那么预热模块的请求会毫无例外地通过。但是,我想避免所有用户都可以访问WarmUp控制器的情况,如果可能的话。这可能是热身模块中的错误还是我错过了什么?

值得注意的是,我也尝试过ASP.NET 4.0应用程序自动启动功能,但它似乎与向应用程序发出实际请求没有相同的效果。还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

问题可能是由于用户帐户用于在IIS中的站点中执行WarmUp请求。请确保更改应用程序池的高级设置下的“身份”设置以及IIS中网站的“高级设置”下的“物理路径凭据”。我不记得哪些会起作用,所以尝试使用/或/两个。

当您从浏览器手动发出请求时,您正在模拟该帐户。当IIS通过WarmUp模块发出请求时,它正在使用上面指定的帐户之一。