我在我的ASP.NET MVC应用程序中创建了一个控制器来处理应用程序的预热/初始化(即初始加载web服务、客户端代理和其他最初可能占用大量时间的操作)。为了调用WarmUp控制器,每当应用程序池启动时,我都使用IIS7/7.5预热模块发送请求。
我不希望所有的用户都能够执行WarmUp控制器操作,所以我用一个[Authorize]属性来修饰控制器。我甚至在我的域中创建了一个组,其中包含应该被允许执行热身操作的用户,并添加了这个组作为授权属性(即[Authorize(Roles = @"MyDomain\AppWarmUp")])的角色。
如果我使用web浏览器手动调用WarmUp控制器并提供适当的凭据,那么一切都会如愿以偿。但是,在使用IIS预热模块时,即使我提供了正确的凭据,我也会在应用程序事件日志中看到警告,指定身份验证失败。
如果我只为预热模块的用户上下文指定了一个类型和用户名,我将得到一个带有消息的ProviderException。
只有当用户名参数与当前Windows标识中的用户名匹配时,才支持
方法。
如果我同时指定用户名和密码/令牌,我将得到一个ArgumentException,其中包含以下消息:
用于模拟的
无效令牌-它不能复制。
如果我从控制器中删除了[Authorize]属性,那么热身模块的请求就会顺利通过,而不会有任何例外。但是,如果可能的话,我想避免所有用户都可以访问WarmUp控制器的情况。这是热身模块中的错误还是我漏掉了什么?
同样值得注意的是,我也尝试过ASP.NET 4.0应用程序自动启动功能,但它似乎没有向应用程序发出实际请求的效果。有没有其他可供考虑的选择?
发布于 2012-05-30 17:25:20
此问题可能是由于用户帐户用于在IIS中的站点中执行WarmUp请求造成的。请确保更改了应用程序池高级设置下的标识设置以及IIS中网站高级设置下的物理路径凭据。我记不起其中哪一个会起作用,所以试着要么/要么两者兼而有之。
当您从浏览器手动发出请求时,您是在模拟帐户。当IIS通过WarmUp模块发出请求时,它使用的是上面指定的一个帐户。
https://stackoverflow.com/questions/5070950
复制相似问题