C# 我是否可以使用SQL Server安全性来控制对(数据库优先)ASP.net应用程序的访问?怎么用?

C# 我是否可以使用SQL Server安全性来控制对(数据库优先)ASP.net应用程序的访问?怎么用?,c#,asp.net,sql-server,asp.net-mvc,security,C#,Asp.net,Sql Server,Asp.net Mvc,Security,到目前为止,我一直是一名SQL server开发人员,但我现在必须制作一个ASP.net MVC5应用程序,以允许用户访问数据。以前,所有访问都是通过(SSL加密的)ODBC连接进行的,ODBC连接使用SQL Server登录进行保护。我熟悉SQL Server安全管理;我有一系列定义的角色,访问通常在模式级别被授予或拒绝。这也使我能够轻松监控/审核访问和数据更改 我读到的关于ASP.net的所有内容似乎都希望我为应用程序创建一个具有非常广泛的读/写权限的单一用户,然后在应用程序级别逐段锁定这些

到目前为止,我一直是一名SQL server开发人员,但我现在必须制作一个ASP.net MVC5应用程序,以允许用户访问数据。以前,所有访问都是通过(SSL加密的)ODBC连接进行的,ODBC连接使用SQL Server登录进行保护。我熟悉SQL Server安全管理;我有一系列定义的角色,访问通常在模式级别被授予或拒绝。这也使我能够轻松监控/审核访问和数据更改

我读到的关于ASP.net的所有内容似乎都希望我为应用程序创建一个具有非常广泛的读/写权限的单一用户,然后在应用程序级别逐段锁定这些用户。如果可能的话,我真的不希望这样做——我希望用户在运行时提供他们的SQL server uid/密码,并基于此确定他们的权限。我想我有两个问题:

  • 这可能吗?它似乎没有被记录在任何地方 一个选择

  • 有没有令人信服的理由让我不应该这样做,即使是这样 可能的我并不完全反对学习新的安全模式 如果这是我需要做的,以确保事情真正安全

  • 请注意,由于各种原因,这里不可能使用Windows身份验证;TLDR

    最好的简单解决方案是只为您的应用程序使用专用用户,并且凭据将存储在Web服务器上的配置文件中,不在公共访问范围内(仅应用程序可以访问)

    通过这种方式,不会泄露任何用户凭据,如果您的应用程序遭到黑客攻击,您只授予它有限的功能(并且在消除威胁后,您可以轻松地将凭据更改为新的凭据)

    以下是您不想做的事情及其原因:

  • 如果您在您想要的中间层中创建了ODBC连接(无论是.NET、Java、Python、PHP还是其他类型),那么您提供的是获取安全连接的凭据—通过连接参数或类似以下的连接字符串:

    驱动程序={SQL Server};Server=myserver地址;数据库=myDataBase;Uid=我的用户名; Pwd=我的密码

  • 或者,您正在内存中的对象上设置属性,这可以完成相同的任务

    因此,您可以选择使用单个用户对该数据库的身份验证来代替拥有所有权限的特殊数据库用户,以限制该ODBC连接的权限

  • 不这样做的原因:

    • 您将无法区分应用程序是否正在数据库中进行更改,或者该用户是否登录到您的数据库并进行了更改

    • 在应用程序中公开数据库登录。根据部署位置的不同,如果不防止暴力攻击(或任何可能危及用户凭据的攻击),这可能会带来安全风险

    • 您无法精确定义允许应用程序执行的操作。有人可以在您的数据库中创建超级用户,然后通过您的应用程序登录,并完全控制您的数据库

    • 不要为应用程序创建单个用户并授予其所有权限。如果应用程序中存在错误,可能会导致数据库处于不一致的状态(坏数据、缺少条目等)。只给它特定操作所需的权限-尽可能地锁定它


  • 不要直接为数据库使用最终用户凭据

    这种方法的基本问题是,您需要能够检索最终用户的密码才能连接到数据库

    这意味着,如果您的系统遭到破坏,您将泄漏其他站点的密码(针对重复使用密码的用户)

    作为折衷方案,您可以将DB密码设置为最终用户密码的迭代哈希。
    但是,您仍然需要将其存储在登录cookie中(可能是加密的),这通常也是一个坏主意

    我希望用户在以下位置提供他们的SQL server uid/密码: 运行时,并基于此确定其权限。。这是公平的吗 可能的它似乎没有作为一个选项记录在任何地方

    绝对有可能。您可以使用OWIN Cookie身份验证中间件
    ,并在声明中存储用户名和密码。然后,每当应用程序需要访问数据库时,动态构造连接字符串

    尽管从今天开始,在SSL上解密身份验证cookie并不容易,但您必须记住,用户名和普通密码都将在每个页面请求中发送到服务器。如果您需要满足以下要求,则可能是法规遵从性问题

    虽然您可以使用会话状态,但在服务器内存中存储普通密码也不是一个好的做法

    有没有令人信服的理由让我不应该这样做,即使是这样 可能的我并不完全反对学习新的安全模式 如果这是我需要做的,以确保事情真正安全

    虽然这种方法在直接访问数据库(无需web服务)的windows应用程序中非常常见,但在web应用程序中并不常见

    如果你有几个用户,这是可以的。但是,如果有很多用户来来往往,那么在SQL Server中为每个用户配置安全设置就成了全职工作。此外,您不能限制谁可以查看哪些页面。

    这就是为什么web应用程序通常将授权逻辑保存在应用程序本身中。因此,我们可以使用限制页面访问。如果你想走那条路,那么我会很高兴的