如何在Startup.cs之外设置数据库连接字符串的用户名和密码?

3
我希望能够限制非登录用户在Web应用程序中的CRUD访问。这意味着我需要在验证他们是否为当前已登录用户之后设置连接字符串。
我在我的代码中有CRUD限制,但想要放置账户权限以确保用户无法访问他们不应该访问的表格或执行不应该执行的操作。
现在我的连接字符串是在我的Startup.cs文件中设置的:
services.AddDbContext<WorldContext>(options => options
    .UseMySql(_config["ConnectionStrings:Database"]));

如何在启动之外设置连接字符串,或者至少为DB帐户设置用户名和密码?在我验证用户已登录之后的某个时候?
我正在使用ASP.Net Core、Entity Framework Core和Asp.NET Core Identity。
我希望授予用户所需的最低权限。引用自这里:https://msdn.microsoft.com/en-us/library/cc716760(v=vs.110).aspx

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


通常情况下,你会在代码中限制CRUD操作,而不是在Web应用程序的数据库中进行限制。虽然如何实现这一点仍然是一个问题,但不确定你是否应该这样做... - Keith Nicholas
@KeithNicholas 我已经反复阅读过应该使用层次化数据库账户的建议。无论是在SO、工作中,还是在大多数数据库/ Web应用安全博客/文章等方面。每个用户不会获得一个账户,而是他们操作运行的查询将在特定账户下运行。我确信当你在SO或Facebook上写评论时,你的查询并不会以数据库管理员身份执行。https://msdn.microsoft.com/en-us/library/cc716760(v=vs.110).aspx#通用安全注意事项 - Douglas Gaskell
当然,但是为什么你的Web应用程序需要具有删除/创建表等权限?这意味着您不使用管理员帐户...只需要选择、插入、删除和更新...除此之外,您的数据库连接之间会有什么不同? - Keith Nicholas
@KeithNicholas 看起来没有必要详细说明我的Web应用程序是用于什么,谁和如何使用它,以及某些用户需要特定权限而其他用户不需要的情况。简短而准确的答案是,非登录用户只需要具有“选择”权限,并且仅限于某些表格。登录用户需要各种权限,从只读到仅对某些表格进行插入和删除。底层还有更多细节,但我的问题应该传达了我想做的事情,即遵循安全最佳实践。 - Douglas Gaskell
1个回答

0

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

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

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

在这里,Asp.net Core 依赖注入将为我们完成大量工作。

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


你能提供代码示例吗?这个问题主要是由我需要利用哪些框架特性来实现它,而不是关于它如何运作的理论驱动的。 - Douglas Gaskell
请告诉我关于您的登录机制。然后我也可以帮您编写代码。 - Ahmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接