Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在internet上安全地使用Entity Framework/C#和SQL Server_C#_Sql Server_Wpf_Entity Framework - Fatal编程技术网

如何在internet上安全地使用Entity Framework/C#和SQL Server

如何在internet上安全地使用Entity Framework/C#和SQL Server,c#,sql-server,wpf,entity-framework,C#,Sql Server,Wpf,Entity Framework,我目前正在开发一个C#/WPF/MVVM/EF6应用程序,它允许位于不同物理位置的多个用户使用第三方API向手机发送和接收短信 数据库存储所有发送和接收的消息,并由用户直接更新(发送消息)或由ASP.NET web挂钩更新(接收消息)。用户正在使用SQL身份验证和动态创建的连接字符串连接到数据库(即,每当创建新的DbContext时传入连接字符串)。EF用于查询和显示数据 我现在遇到了我认为可能是我的设计的一个基本安全问题。用户都需要直接访问SQL数据库才能使用实体框架方法。经过一些研究,简单地

我目前正在开发一个C#/WPF/MVVM/EF6应用程序,它允许位于不同物理位置的多个用户使用第三方API向手机发送和接收短信

数据库存储所有发送和接收的消息,并由用户直接更新(发送消息)或由ASP.NET web挂钩更新(接收消息)。用户正在使用SQL身份验证和动态创建的连接字符串连接到数据库(即,每当创建新的DbContext时传入连接字符串)。EF用于查询和显示数据

我现在遇到了我认为可能是我的设计的一个基本安全问题。用户都需要直接访问SQL数据库才能使用实体框架方法。经过一些研究,简单地将SQL Server暴露在internet上似乎是非常危险的。大多数建议是使用VPN或IP白名单,但不幸的是,这两种都不是选项。我们将由不提供VPN的第三方托管SQL Server,用户将经常处于不同的位置,因此他们的IP不会是静态的


是否有其他选项可用于维护SQL Server直接访问和其他安全性?我能想到的唯一选择是通过为应用程序创建一个API来查询和重构代码,从而使用API而不是实体框架来提取数据,从而完全改变体系结构。如有任何意见,将不胜感激

您可以创建一个直接访问数据库的API,该API将通过internet公开,并且您将只定义要在数据库上执行的方法(例如CRUD操作)

wpf应用程序将不再直接与数据库通信,而是与api通信。api是保存连接字符串的api,并且是唯一可以直接访问数据库的api。这样,您就不会通过internet公开整个数据库

您还可以添加身份验证,这样只有登录的用户才能从数据库获取/插入/修改数据,还可以添加授权,以处理用户权限

现在,您应该重构应用程序以使用API。尽管如果您使用类似于存储库模式的东西,它只需要对存储库本身进行一些更改即可正常工作

现在,您的应用程序设计有了另一个抽象层,即API

WPF应用程序→ API→ 数据库


我在应用程序中使用API的方式是使用
HttpWebRequest
类。但是,还有其他方法可以处理这个问题,本文对此做了很好的解释:

您可以创建一个直接访问数据库的API,该API将通过internet公开,并且您将只定义要在数据库上执行的方法(例如CRUD操作)

wpf应用程序将不再直接与数据库通信,而是与api通信。api是保存连接字符串的api,并且是唯一可以直接访问数据库的api。这样,您就不会通过internet公开整个数据库

您还可以添加身份验证,这样只有登录的用户才能从数据库获取/插入/修改数据,还可以添加授权,以处理用户权限

现在,您应该重构应用程序以使用API。尽管如果您使用类似于存储库模式的东西,它只需要对存储库本身进行一些更改即可正常工作

现在,您的应用程序设计有了另一个抽象层,即API

WPF应用程序→ API→ 数据库


我在应用程序中使用API的方式是使用
HttpWebRequest
类。不过,还有其他方法可以处理这个问题,本文对此做了很好的解释:

我同意您创建API并充当数据库适配器,原因有二

  • 如果您想扩展项目,让所有客户机存储连接字符串是非常危险和困难的。 尤其是像WPF这样的Windows应用程序。所以,让适配器使您能够无缝地进行更新和维护

  • 若客户端直接与数据库联系,而没有IP白名单,则意味着您将数据库公开给公众

  • 我可以想象的一个想法是创建一个WebAPI,让它为每个具有有限权限的客户端动态创建SQL用户。然后每隔一段时间周期性地撤销SQL用户(可能使用Webjob)。所以客户端将不会有长寿命的连接字符串。您将只需要一个端点

    客户端需要做的是向WebAPI请求临时连接字符串。使用此解决方案,您将至少有机会验证客户端的凭据、角色、ip、版本号等,然后在撤销其连接字符串时向其提供连接字符串。它仍然需要API。但在我看来,客户端将直接与数据库通信,具有更好的安全性


    注意:因为您允许客户端使用数据库。确保客户端始终是最新版本。我认为当客户端请求连接字符串时,您可以进行检查。

    我同意您创建API并像数据库适配器一样工作,原因有二

  • 如果您想扩展项目,让所有客户机存储连接字符串是非常危险和困难的。 尤其是像WPF这样的Windows应用程序。所以,让适配器使您能够无缝地进行更新和维护

  • 若客户端直接与数据库联系,而没有IP白名单,则意味着您将数据库公开给公众

  • 我可以想象的一个想法是创建一个WebAPI