AppDomain ShadowCopy和模拟 - 指定的用户没有有效的配置文件

时间:2014-06-04 00:11:25

标签: asp.net identity appdomain

我有一个使用模拟的ASP.NET Web应用程序,其中包含以下web.config条目:

<system.web>
  <identity impersonate="true" />
  <authentication mode="Windows" />
  <authorization>
    <allow roles="Administrators" />
    <deny users="*" />
  </authorization>
</system.web>

独立地,这很好用。用户必须以管理员身份登录,当他们这样做时,应用程序可以代表他们执行管理操作。

除此之外,我想在一个单独的AppDomain中隔离一些操作,理想情况下也喜欢影子复制文件。我设置了这样的AppDomain:

AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ShadowCopyFiles = "true";
appSetup.ApplicationBase = 
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

hostAppDomain = AppDomain.CreateDomain(
    "AppDomain1",
    AppDomain.CurrentDomain.Evidence,
    appSetup);

然后我尝试在此AppDomain中创建一个对象实例,如:

var crossObject = (CrossAppDomainObject)hostAppDomain.CreateInstanceAndUnwrap(
    typeof(CrossAppDomainObject).Assembly.FullName,
    typeof(CrossAppDomainObject).FullName);

这会产生错误:

指定的用户没有有效的个人资料。无法加载'MyAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。

如果我将AppDomain设置为使用ShadowCopy,问题就会消失。任何人都可以解释这种行为吗?

更具体一点,我实际上不需要复制所有程序集。最终我的CrossAppDomainObject将使用MEF从另一个文件夹加载程序集,而这些是我想要复制阴影的其他程序集。我怀疑通过将阴影副本配置为在其复制的文件中具有选择性,我可以得到我想要的东西。 但是,我仍然想知道导致此错误的原因。

1 个答案:

答案 0 :(得分:2)

而不是将阴影复制到哪些程序集,而是问题是由于将程序集复制到&#39;的问题引起的。

即,未指定AppDomainSetup.CachePath会导致运行时在进行卷影复制时尝试使用&#34;用户的下载缓存&#34;位于用户个人资料目录中的位置(在C:\Users\内)。

您的错误是因为管理员是一个没有此类个人资料目录的特殊帐户。

一种解决方案是简单地使用运行Web应用程序的AppDomain文件夹,因为ASP.NET已经使用了特定的CachePath(类似于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\d32f4325),因此它适用于这样的&#39;虚拟&# 39;用户帐户。如果这样的路径适合你,那就做吧

appSetup.CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath;