【问题标题】:How to set DB connection string username & password outside of Startup.cs?如何在 Startup.cs 之外设置数据库连接字符串用户名和密码?
【发布时间】:2017-01-19 01:55:17
【问题描述】:

我希望能够限制未登录 Web 应用程序用户的 CRUD 访问。这意味着我需要在验证他们是否是当前登录用户后设置连接字符串。

我的代码中有 CRUD 限制,但希望设置帐户权限以确保用户无法访问他们不应该访问的表,或执行他们不应该执行的操作。

现在我的连接字符串设置在我的Startup.cs 文件中:

services.AddDbContext<WorldContext>(options => options
    .UseMySql(_config["ConnectionStrings:Database"]));

如何在启动之外设置连接字符串,或者至少设置数据库帐户的用户名和密码?在我验证用户已登录后的某个时间?

我正在使用ASP.Net CoreEntity Framework CoreAsp.NET Core Identity


我只想授予用户需要的必要权限。引用自这里:https://msdn.microsoft.com/en-us/library/cc716760(v=vs.110).aspx

在数据源中只授予用户必要的权限。数据源管理员应该只授予必要的权限 给用户。即使 Entity SQL 不支持 DML 语句 修改数据,例如 INSERT、UPDATE 或 DELETE,用户仍然可以访问 与数据源的连接。恶意用户可以使用它 以本地语言执行 DML 语句的连接 数据源。

【问题讨论】:

  • 通常您在代码中限制 CRUD,而不是在您的 Web 应用程序数据库中。关于如何做的问题仍然有效,但不确定你应该这样做......
  • @KeithNicholas 我一遍又一遍地读到你应该使用分层数据库帐户。在 SO、工作中以及大多数 DB/Web 应用程序安全博客/文章等中。每个用户都没有帐户,但从他们的操作中运行的查询是在某个帐户下运行的。我敢肯定,当您在 SO 或 Facebook 上发表评论时,您的查询不会以数据库管理员的身份执行。 msdn.microsoft.com/en-us/library/… 安全注意事项
  • 当然,但是为什么您的网络应用程序需要删除/创建表等权限?这意味着您不使用管理员帐户....只需要选择、插入、删除更新....除此之外,您的数据库连接之间会有什么不同?
  • @KeithNicholas 似乎没有必要详细说明我的 Web 应用程序的用途、使用对象和方式,以及某些用户需要某些权限而其他用户不需要。简短而准确的答案是,未登录的用户只需要拥有select 权限,并且仅限于某些表。登录用户需要各种权限,从只读到插入和删除,仅限某些表。引擎盖下还有更多细节,但我的问题应该传达我正在尝试做的事情,即遵循安全最佳实践。

标签: c# entity-framework asp.net-core asp.net-identity


【解决方案1】:

有多种方法可以做到这一点,但我想这样做。

创建两个DbContext 一个用于用户身份验证和读取用户数据库登录详细信息。第二个用于过去对其余表执行 CRUD 操作的用户。

问题是我们如何注册这两个DbContext 以及在哪里???

这里Asp.net Core 依赖注入将为我们做很多工作。

我们可以在Startup.cs 中注册LoginDbContext(如示例项目所做的那样),它将用于验证用户并获取DB 用户登录详细信息。还需要在我们验证用户的地方注入IServiceCollection,因此,我们可以注册CRUDDbContext,同时使用从数据库中获取的用户详细信息创建连接字符串。之后我们可以在控制器或存储库类中注入CRUDDbContext

【讨论】:

  • 能否提供代码示例?这个问题主要是由我需要利用哪些框架特性来实现这一点,而不是关于它如何运作的理论。
  • 请告诉我您的登录机制。之后,我也可以帮助您处理代码。
猜你喜欢
  • 2015-06-29
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多