我在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应用程序自动启动功能,但它似乎与向应用程序发出实际请求没有相同的效果。还有其他选择吗?
答案 0 :(得分:1)
问题可能是由于用户帐户用于在IIS中的站点中执行WarmUp请求。请确保更改应用程序池的高级设置下的“身份”设置以及IIS中网站的“高级设置”下的“物理路径凭据”。我不记得哪些会起作用,所以尝试使用/或/两个。
当您从浏览器手动发出请求时,您正在模拟该帐户。当IIS通过WarmUp模块发出请求时,它正在使用上面指定的帐户之一。