我有两个Web应用程序部署到IIS Web服务器,它们都是在同一个IIS服务器上的同一应用程序池上的,但是是单独的应用程序池。它们都使用Windows AD组进行身份验证,因此SiteA用户被添加到SiteA AD Group,SiteB用户被添加到SiteB AD Group,并且允许他们访问各自的站点。这些网站没有任何联系,完全相互独立。在全局的Application_Start中,他们有:
站点A
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
log4net.Config.XmlConfigurator.Configure();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var rolesDictionary = ((SiteAMembershipProvider)(Membership.Provider)).InitialisePermissionDictionary();
HttpRuntime.Cache.Insert(
/* key */ "RolesDictionary",
/* value */ rolesDictionary,
/* dependencies */ null,
/* absoluteExpiration */ Cache.NoAbsoluteExpiration,
/* slidingExpiration */ Cache.NoSlidingExpiration,
/* priority */ CacheItemPriority.NotRemovable,
/* onRemoveCallback */ null);
}
SiteB中
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var rolesDictionary = ((SiteBMembershipProvider)(Membership.Provider)).InitialisePermissionDictionary();
HttpRuntime.Cache.Insert(
/* key */ "RolesDictionary",
/* value */ rolesDictionary,
/* dependencies */ null,
/* absoluteExpiration */ Cache.NoAbsoluteExpiration,
/* slidingExpiration */ Cache.NoSlidingExpiration,
/* priority */ CacheItemPriority.NotRemovable,
/* onRemoveCallback */ null);
}
唯一的原因我表明这是因为我怀疑这就是问题所在,但实际上我不知道。
问题是,这两个网站都可以单独运作。我可以启动任一个并获得访问权限,因为我在两个AD组中。问题是当我在浏览器中打开一个站点,然后打开另一个站点时,我收到运行时错误:
运行时错误
描述:处理您的请求时发生异常。 此外,执行自定义时发生另一个异常 第一个异常的错误页面。请求已被终止。
无论我首先打开哪个站点,都会发生这种情况,因此如果我打开SiteA,它将打开正常,然后如果我在另一个选项卡中打开SiteB,它将产生SiteB的错误。反之亦然,如果我先打开SiteB,然后打开SiteA,它将为SiteA产生错误。我可以单独打开一个,但必须关闭浏览器,以及浏览器的所有实例,才能打开另一个。所以我认为这与它的缓存无关,但我不能确定。当应用程序启动时,在全局的Application_PostAuthenticateRequest方法中,标识用户,如果是必要的AD组的一部分,则将其详细信息添加到Context.User中。它在两个应用程序中的工作方式完全相同。有人知道为什么会这样吗?当两个应用程序同时启动时,是否与两个试图保存到Context.User的应用程序有关?
编辑:
忘记添加,当我在开发环境中同时运行两者时,它们都可以工作。
EDIT2:
根据Anderson Pimentel的建议,我在事件查看器中检查了应用程序日志,并出现以下错误:
异常信息: 异常类型:CryptographicException 异常消息:加密操作期间发生错误。 在System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func,Byte [] input) 在System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) at AuditTracker.MvcApplication.Application_PostAuthenticateRequest(Object sender,EventArgs args) 在System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
如果我错了,请纠正我,但看起来SiteB正在尝试解密已经由SiteA加密的身份验证cookie,因此有一个不同的密钥,这就是它正在崩溃的地方。是吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
要使其工作,您必须使用两个单独的应用程序池。
SiteB不允许SiteA AD用户输入(这是您在首次使用SiteA时的身份),反之亦然。这可以通过使用单独的应用程序池来避免:那么您在两个站点上都有不同的身份。