Sql server EF代码首先说明如何正确设置数据库凭据

Sql server EF代码首先说明如何正确设置数据库凭据,sql-server,entity-framework,ef-code-first,Sql Server,Entity Framework,Ef Code First,我有开发人员MVC4+EF代码优先+SQL Server 2008 web应用程序。用IIS7将其上传到prod服务器。已创建新凭据PC。将空数据库PCDB添加到SQL Server,并将用户PC分配给它,并具有所有者权限。当我运行web应用程序时,我收到错误消息 无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用代码优先或代码优先迁移创建的数据库的模型兼容性 我的连接字符串是 data source=174.xx.x.x;initial catalog=pcdb;user id=pc

我有开发人员MVC4+EF代码优先+SQL Server 2008 web应用程序。用IIS7将其上传到prod服务器。已创建新凭据
PC
。将空数据库
PCDB
添加到SQL Server,并将用户PC分配给它,并具有所有者权限。当我运行web应用程序时,我收到错误消息

无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用代码优先或代码优先迁移创建的数据库的模型兼容性

我的连接字符串是

data source=174.xx.x.x;initial catalog=pcdb;user id=pc;password=xxxxx;
这个异常是可以理解的,我可以删除
PCDB
数据库,让EFCode自己先创建它。但是凭证
PC
呢?我不想让
PC
用户成为管理员,但如果没有它,EF code First将无法在SQL Server中创建新数据库


如何解决这个问题?

总体设计从Web站点ASP.NET/IIS的窗体或Windows身份验证开始。 并以您想要/需要的应用程序和DB身份验证结束。应用程序授权是另一个主题。我不会在这里讨论这个问题

实际上,您没有声明所需的身份验证模型。 因此,我将从免责声明开始。这是我将在生产现场使用的建议。但这不是最终的结局,也不是你可以考虑的唯一短期解决方案。 这是一个单人秀可以实现的解决方案。并且是安全的,没有过多的管理工作来保持运行

通过Windows身份验证使用SQL server登录 但您不需要将每个用户都添加到SQL server。
还有模仿的选项。但这可能会变得棘手,而这种解释并不是模仿。这是另一种方法

首先确保网站正在使用Windows身份验证

将IIS设置为使用Windows身份验证:

现在,IIS上网站后面的应用程序池已配置

我将在应用程序池中推荐一个Psuedo服务用户,作为启动的好方法。 ie WEBAPPLICATION\u X\u用户。每个应用程序池可以有一个单独的用户。每个用户只能访问其数据库。所以你得到了应用程序分离。您可以在此处输入用户和密码。IIS将根据需要进行加密和解密。(优于Web.config中的计划文本)

此用户应该减少了服务器本身上的身份验证。不是域上的管理员用户,甚至不是本地管理员。刚好可以使用Sql server创建数据库因此创建一个普通windows用户

让ASP.Net登录到数据库。让ASP.net对密码进行加密和解密

现在的情况是IIS上的Windows身份验证。IIS有一个应用程序池,其中有一个可以登录SQL server的特殊windows用户。您已将此用户添加到SQL server实例,并为此服务用户分配了创建DBs的能力。不要给用户访问所有数据库的权限:-)只给它将创建的数据库。加上公共访问(通过EF)

验证WEB应用中的用户凭据情况。 请参见[System.Security.Principal.WindowsIdentity]
这将显示您的windows身份验证最终用户

System.Environment.UserName应具有您放置在IIS应用程序池中的服务用户ID

现在,当EF在SQL server实例上创建或访问数据时,它将与 System.Environment.UserName,如果WEB.CONFIG条目设置为使用windows集成安全性

<connectionStrings>
<add name="DbContextName" connectionString="Data Source=Your SQL server Instance;Initial Catalog=The DBNAME;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

并且您知道经过身份验证的用户httpContext会像线程当前主体一样将其提供给您。 默认情况下,HttpContext.User映射到{System.Security.Principal.WindowsPrincipal}

因此,您可以执行应用程序级检查。 同样的方法也适用于表单身份验证

警告:如果您有windows WPF方法(即您没有使用IIS,因此没有应用程序池),则必须更改此方法,该方法更加复杂,不再是最佳的起点


我希望这能帮助你开始

Tomas,你明白了吗?Phil,我想Tomas想要的是一种在SQL server上设置帐户的方法,这样代码第一次生成数据库时就不会让EF连接字符串中指定的数据库用户成为sysadmin。至少,这是我的假设,基于我最终在这里需要同样的东西。。。