Asp.net mvc ASP.NET MVC:Serve.cshtml文件;原样;

Asp.net mvc ASP.NET MVC:Serve.cshtml文件;原样;,asp.net-mvc,razor,Asp.net Mvc,Razor,假设ASP.NET MVC web应用程序允许用户浏览服务器上某些VCS存储库的内容。现在,除其他外,这个存储库包含*.cshtml文件,我想按原样呈现这些文件 <security> <requestFiltering> <fileExtensions> <remove fileExtension=".cshtml" /> <remove fileExtension=".vbhtml"

假设ASP.NET MVC web应用程序允许用户浏览服务器上某些VCS存储库的内容。现在,除其他外,这个存储库包含
*.cshtml
文件,我想按原样呈现这些文件

  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>
换句话说,当用户导航到时,就会显示
main.cs
文件的“原始”内容,这已经可以正常工作了。但是,访问会在ASP.NET运行时的深处导致HttpException

  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>
我尝试从
/browse
中删除
BlockViewHandler
,并在
中显式允许
*.cshtml
文件,但无效:

  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>

  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>


尝试直接从文件系统本身读取它,以便它绕过razor。比如:

  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>
string filePath = Server.MapPath("~/directory/subdirectory/main.cshtml");
string rawTemplate = System.IO.File.ReadAllText(filePath);

然后将其填充到ViewModel或直接写入响应?您可能需要Html.Raw()来显示它,因此如果用户可以编辑它,您可能需要从XSS内容中清理模板。

这些.cshtml文件无论如何都不在磁盘上--它们在VCS存储库中,我可以通过编程从中查找它们。这里的罪魁祸首是以“.cshtml”结尾的URL,ASP.NET似乎被它卡住了。
  <security>
    <requestFiltering>
      <fileExtensions>
        <remove fileExtension=".cshtml" />
        <remove fileExtension=".vbhtml" />

        <add fileExtension=".cshtml" allowed="true" />
        <add fileExtension=".vbhtml" allowed="true" />
      </fileExtensions>
    </requestFiltering>
  </security>
</system.webServer>