mod_mono asp MVC4 error: System.Security.SecurityException - Couldn't impersonate token

mod_mono asp MVC4 error: System.Security.SecurityException - Couldn't impersonate token

我在 ASP.net MVC4 框架版本 4.5 中开发了一个小型 webapp。使用 Visual Studio 2015 进行调试时,这一切都非常有效。但是我没有 Windows 服务器,而是 Linux (Ubuntu 14.04 VPS) 和我希望在那里部署。

我有最新的单声道和 mod_mono 运行 apache2。它似乎正常执行,但我遇到了一些错误。

我通过添加 <customError mode="off"> 解决了第一个问题,也看到了错误,然后添加了一个 mono/register 文件夹。

但我现在被这个错误难住了:

System.Security.SecurityException
Couldn't impersonate token.

Description: HTTP 500.Error processing request.
Details: Non-web exception. Exception origin (name of application or object): mscorlib.
Exception stack trace:
  at System.Security.Principal.WindowsImpersonationContext..ctor (IntPtr token) <0x41ef9dd0 + 0x0006f> in <filename unknown>:0 
  at System.Security.Principal.WindowsIdentity.Impersonate (IntPtr userToken) <0x41ef9d50 + 0x0003c> in <filename unknown>:0 
  at System.CodeDom.Compiler.Executor.ExecWaitWithCapture (IntPtr userToken, System.String cmd, System.String currentDir, System.CodeDom.Compiler.TempFileCollection tempFiles, System.String& outputName, System.String& errorName) <0x41ef9c90 + 0x00038> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.Compile (System.CodeDom.Compiler.CompilerParameters options, System.String compilerFullPath, System.String arguments, System.String& outputFile, System.Int32& nativeReturnValue) <0x41ef9a10 + 0x0010b> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x41ef5c40 + 0x005fb> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x41ef5aa0 + 0x000c7> in <filename unknown>:0 
  at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromFile (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x41ef58f0 + 0x0004d> in <filename unknown>:0 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath, System.CodeDom.Compiler.CompilerParameters options) <0x41ee0a70 + 0x00991> in <filename unknown>:0 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath) <0x41ee0a30 + 0x00023> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GenerateAssembly (System.Web.Compilation.AssemblyBuilder abuilder, System.Web.Compilation.BuildProviderGroup group, System.Web.VirtualPath vp, Boolean debug) <0x41ed6b10 + 0x009b7> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.BuildInner (System.Web.VirtualPath vp, Boolean debug) <0x41eac440 + 0x00523> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.Build (System.Web.VirtualPath vp) <0x41eabbc0 + 0x0011b> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GetCompiledType (System.Web.VirtualPath virtualPath) <0x41eaaa70 + 0x00093> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GetCompiledType (System.String virtualPath) <0x41eaa690 + 0x00017> in <filename unknown>:0 
  at System.Web.HttpApplicationFactory.InitType (System.Web.HttpContext context) <0x41e9c4a0 + 0x0041b> in <filename unknown>:0 

我无法修复该错误。我尝试了以下步骤:

它们都给出了相同的运行时错误。

我已经使用 Travis CI 检查了我的代码,它通过了以下配置:

language: CSharp
solution: BannedFromHighsec.sln
script:
    - nuget restore BannedFromHighsec.sln
    - xbuild /p:Configuration=Release /target:BannedFromHighsec BannedFromHighsec.sln /p:TargetFrameworkVersion="v4.5" /p:DebugSymbols=False

Travis 的 Pastebin CI 日志:http://pastebin.com/5s6p97i3

所以我有点想是我的代码出了问题。但我不确定它是什么,因为它是一个简单的应用程序。使用 SQlite 和从 API 和第二个数据库中提取数据的基本 CRUD 操作。我没有使用登录名或任何东西。

我希望有人能帮助我,我开始掌握 asp.net MVC,并且想知道如何在 linux 上实际部署它,如果可能的话。 :)

如果您需要任何其他信息、配置、源代码,请告诉我,我很乐意提供。只是不确定该错误代码需要什么。

首先我会说我的设置与您的不同。我有一个 ASP.NET MVC 网站,在 Raspberry Pi 2、运行ning Raspbian Jessie(2016 年 2 月版)上使用 .NET 4.5.2。此发行版上的 Stock Mono 是 3.2.8,但我将我的升级到 4.2.2。

因此,我 运行 收到了与您在尝试将测试站点添加到 运行 时完全相同的错误消息。对我有用的是注释掉我的 web.config 中的两个 条目,如下所示。

<system.codedom>
  <compilers>
    <!--
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
    <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    -->
  </compilers>
</system.codedom>

然后重置apache服务后

sudo service apache2 restart

之后,MVC 站点加载正常。

我不能说这是一个完美的解决方案,因为我不确定为什么注释掉 xml 的那些行有效。如果这对你有用,那就太好了,但我希望有人能向我解释为什么这两行 xml 是这个问题的原因。

按照已接受的答案注释掉编译器条目会有效地禁用 Microsoft.CodeDom.Providers.DotNetCompilerPlatform NuGet 包 - 如果您打算 运行 您的网站仅在单声道上,最好卸载它加上 Microsoft.Net.Compilers (前者的依赖项)完全没有用 - 单声道可能与它不兼容,它有自己的服务 API 编译器。