部署了c#mvc web app运行时错误

时间:2016-12-29 11:12:41

标签: c# asp.net asp.net-mvc

我有两个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,因此有一个不同的密钥,这就是它正在崩溃的地方。是吗?

2 个答案:

答案 0 :(得分:1)

您可能遗漏了web.config上的计算机密钥信息,该信息用作加密和解密的对称密钥。

在IIS中生成密钥:

  

转到您的应用程序 - >机器钥匙 - >生成密钥

有关MSDN的更多信息。

答案 1 :(得分:0)

要使其工作,您必须使用两个单独的应用程序池。

SiteB不允许SiteA AD用户输入(这是您在首次使用SiteA时的身份),反之亦然。这可以通过使用单独的应用程序池来避免:那么您在两个站点上都有不同的身份。