3

我有开发人员 MVC4 + EF Code First + SQL Server 2008 Web 应用程序。使用 IIS7 将其上传到产品服务器。创建了新凭据PC。将空数据库添加PCDB到 SQL Server 并为其分配具有所有者权限的用户 PC。当我运行网络应用程序时出现错误

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

我的连接字符串是

data source=174.xx.x.x;initial catalog=pcdb;user id=pc;password=xxxxx;

例外是可以理解的,我可以删除PCDB数据库并让 EFCode First 自己创建它。但是凭证PC呢?我不想让PC用户成为管理员,但没有它,EF Code First 将无法在 SQL Server 中创建新数据库。

如何解决问题?

4

1 回答 1

0

整体设计从 WebsiteASP.NET/IIS 上的表单或 Windows 身份验证开始。并以您想要/需要的应用程序和数据库身份验证结束。应用程序授权是另一个主题。我不会在这里讨论。

您实际上并未说明所需的身份验证模型。因此,我将从免责声明开始。这是我将在生产站点中使用的建议。但这不是最终的结局,也不是​​您可能考虑的唯一短期解决方案。

这是一个单人表演可以发挥作用的解决方案。并且是安全的,无需过多的管理工作即可继续运行。

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

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

将 IIS 设置为使用 Windows 身份验证: 在此处输入图像描述

现在你已经配置好IIS上网站后面的APP Pool了。.

我将建议在 APP 池中使用 Psuedo-service 用户作为开始的好方法。即WEBAPPLICATION_X_USER。每个 APP 池可以有一个单独的用户。每个用户只能访问其数据库。所以你得到应用程序分离。您在此处输入用户名和密码。IIS 将根据需要进行加密和解密。(比 Web.config 中的计划文本更好)

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

让 ASP.Net 登录到 DB。让 ASP.net 加密和解密密码。

SQL Server 中的特殊服务用户权限

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

验证您的WEB APP中的用户凭证情况。请参阅[System.Security.Principal.WindowsIdentity] 这应该显示您的 Windows 身份验证最终用户。

System.Environment.UserName 应该具有您放置在 IIS APP POOL 中的服务用户 ID。

现在,当 EF 在 SQL 服务器实例上创建或访问数据时,如果 WEB.CONFIG 条目设置为使用 windows 集成安全性,它将与 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会像thread current principal一样把它给你。HttpContext.User 默认映射到 {System.Security.Principal.WindowsPrincipal}

因此,您可以执行应用程序级别检查。同样的方法也应该适用于 Forms Authentication 。

警告:如果您有Windows WPF 方法(即您没有使用 IIS,因此没有 APP 池),则必须更改此方法并且更复杂,不再是最佳起点。

我希望这可以帮助您入门

于 2013-02-19T14:20:27.930 回答