我有开发人员MVC4 + EF Code First + SQL Server 2008网络应用程序。使用IIS7将其上载到prod服务器。创建了新凭据PC
。向SQL Server添加了空数据库PCDB
,并在拥有者权限的情况下将用户PC分配给它。当我运行网络应用程序时,我收到错误
无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用“代码优先”或“代码优先迁移”
创建的数据库的模型兼容性
我的连接字符串是
data source=174.xx.x.x;initial catalog=pcdb;user id=pc;password=xxxxx;
异常是可以理解的,我可以删除PCDB
数据库并让EFCode首先自己创建它。但凭据PC
怎么样?我不想让PC
用户成为管理员,但没有它,EF Code First将无法在SQL Server中创建新数据库。
如何解决问题?
答案 0 :(得分:0)
整体设计从WebsiteASP.NET / IIS的Forms或Windows身份验证开始。 并以您想要/需要的应用程序和数据库身份验证结束。应用程序授权是另一个主题我不会在这里讨论。
您实际上并未说明所需的身份验证模型。 所以我将从免责声明开始。这是我将在生产现场使用的建议。但它不是最终的终极游戏,也不是您可能考虑的唯一短期解决方案。
这是一个单人演出可以开始工作的解决方案。并且安全且没有过多的管理工作来继续运行。
通过Windows身份验证使用SQL Server登录 但是您不需要将每个用户都添加到SQL服务器 还有冒充的选择。但这可能会变得棘手,这种解释并非模仿。这是另一种方法。
首先确保网站使用Windows身份验证
将IIS设置为使用Windows身份验证:
现在您已配置IIS 网站背后的 APP池。
我打算在APP池中推荐一个Psuedo服务用户作为开始的好方法。 即WEBAPPLICATION_X_USER。每个APP池可以有一个单独的用户。每个用户只能访问其数据库。所以你得到应用程序分离。您在此输入用户名和密码。 IIS将根据需要进行加密和解密。 (优于Web.config中的计划文本)
此用户应减少服务器本身的身份验证。不是域上的ADMIN用户,甚至是本地管理员。这足以让它可以使用Sql server来创建一个DB。 因此,请创建常规Windows用户
让ASP.Net登录到DB。让ASP.net加密和解密密码。
现在情况是IIS上的Windows AUTH。 IIS有一个带有特殊Windows用户的应用程序池,可以登录到SQL服务器。您已将此用户添加到SQL Server实例,并为此服务用户分配了创建DB的功能。不要让用户访问所有Dbs :-)只是它将创建的那个。加上公共访问(通过EF)。
验证WEB APP中的用户凭据状况。 请参阅 [System.Security.Principal.WindowsIdentity] 这应该显示您的Windows身份验证的最终用户。
System.Environment.UserName 应该具有您在IIS APP POOL中放置的服务用户ID。
现在当EF去创建或访问SQL服务器实例上的数据时,它将与之连接 如果WEB.CONFIG条目设置为使用windows integrated security
,则为System.Environment.UserName<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,因此没有APP池),那么这种方法必须改变,并且更复杂,不再是最佳起点。
我希望这可以帮助你开始