将MVC部署到共享主机导致安全异常

时间:2013-01-31 13:28:27

标签: asp.net-mvc deployment shared-hosting

我正在尝试将我的MVC3(我也尝试过MVC4)发布到我的共享主机(安装了MVC3),但我收到了这个安全异常:

  

安全例外

     

描述:应用程序尝试执行安全策略不允许的操作。要授予此应用程序所需的权限,请与您的系统管理员联系或在配置文件中更改应用程序的信任级别。

Exception Details: System.Security.SecurityException: Request failed.
  

来源错误:

Line 20: @foreach (var item in Model) {

以下是错误的前几行:

System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) +0
   System.Security.CodeAccessSecurityEngine.Check(PermissionSet permSet, StackCrawlMark& stackMark) +31
   System.Security.PermissionSet.Demand() +68
   System.Data.LocalDBAPI.**DemandLocalDBPermissions**() +241
   System.Data.LocalDBAPI.CreateLocalDBInstance(String instance) +32
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +5306971
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +145
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +262
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +307
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions) +434
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +225

我的共享主机正在运行trust level = medium。所以在我的localmachine上的项目中,我还在Web配置中将信任设置为中等,并且它运行得很好:

<trust level="Medium" originUrl="" />

我将数据库上传到服务器,因此我不会重新使用EF来重建服务器上的数据库。

但是看看错误,我认为 LocalDbConnectionFactory 可能是罪魁祸首?或者部署后应该留在那里? 我的web.config的一部分:

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=liveServer,com;Initial Catalog=sarmie;Persist Security Info=True;User ID=liveServer;Password=liveServer;" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
    <parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>

这是我的Context类:

public class MvcApplication4Context : DbContext
    {
        //public MvcApplication4Context()
        //{
        //    System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcApplication4.Models.MvcApplication4Context>());
        //}

        public DbSet<MvcApplication2.Models.Ad> Ads { get; set; }
    }

我错过了什么吗?共享主机是否应该安装一些东西以使LocalDB工作?或者有没有办法绕过这个并让我的LINQ查询工作?

请帮忙

此致 大卫

2 个答案:

答案 0 :(得分:1)

您需要choose the right database initializer

如果您正在使用可以创建数据库的初始化程序,那么当发生这种情况时,将在您的主机方案中失败

您可能需要考虑使用EF迁移,因为他们可以“就地”更新架构。

答案 1 :(得分:1)

好的,这让我有些想弄清楚。第一步,不要使用LOCALDB或LocalDbConnectionFactory,我认为共享主机不支持它。而是使用提到的here

的SQLCE 4.0

通过nuget安装EntityFramework.SqlServerCompact

请记住将此文件放在web.config中(如果尚未添加)。 MvcApplication8.Models.MvcApplication8Context将是您的上下文类:

<connectionStrings>
  <add name="MvcApplication8.Models.MvcApplication8Context" connectionString="Data Source=|DataDirectory|mvc8Context.sdf" providerName="System.Data.SqlServerCe.4.0" />
  <add name="DefaultConnection" connectionString="Data Source=****;Initial Catalog=testing;Persist Security Info=True;User ID=****;Password=****;" providerName="System.Data.SqlClient" />
</connectionStrings>

<entityFramework>
 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="System.Data.SqlServerCe.4.0" />
  </parameters>
 </defaultConnectionFactory>
</entityFramework>
<system.data>
<DbProviderFactories>
  <remove invariant="System.Data.SqlServerCe.4.0" />
  <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>

如上面的链接所述,请记住将以下DLL设置为“copy local”= true。 的EntityFramework SqlserverCE SqlserverCE.Entity

然后,您需要将数据库从本地PC复制​​/导出到共享主机。

作为旁注:不要使用automapper,我已经尝试了一切以中等信任的方式工作,我不认为这是可能的。你会收到错误:

  

System.Security.SecurityException:请求类型的权限   'System.Security.Permissions.ReflectionPermission,mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'   失败。   我现在正在使用valueinjecter,它运作得很好。

现在它终于工作了。