Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.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
C# 用于身份验证的SQL登录技术_C#_Asp.net_Sql_Sql Server - Fatal编程技术网

C# 用于身份验证的SQL登录技术

C# 用于身份验证的SQL登录技术,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我有一个非常基本的问题,想知道其他专家是如何做到这一点的 我有一个有大约100个用户的应用程序。我一直在使用SQL登录来验证这些用户。这些用户已强制执行密码策略。当任何用户的密码过期时,我都会面临困难,即我必须自己从SSMS重置密码。它有时会和我做的其他任务一起成为一项困难的工作 一些专家告诉我,创建自己的用户表并在该表中包含所有用户详细信息是一种很好的做法。我已经创建了一个包含以下列的用户表 用户Id 用户名 密码 密码CreationDate 密码过期日期 密码激活 一个简单的问题。我的

我有一个非常基本的问题,想知道其他专家是如何做到这一点的
我有一个有大约100个用户的应用程序。我一直在使用SQL登录来验证这些用户。这些用户已强制执行密码策略。当任何用户的密码过期时,我都会面临困难,即我必须自己从SSMS重置密码。它有时会和我做的其他任务一起成为一项困难的工作

一些专家告诉我,创建自己的用户表并在该表中包含所有用户详细信息是一种很好的做法。我已经创建了一个包含以下列的用户表

  • 用户Id
  • 用户名
  • 密码
  • 密码CreationDate
  • 密码过期日期
  • 密码激活
一个简单的问题。我的用户如何连接到数据库。当然,我需要应用程序中的连接字符串。这个连接字符串需要用户名和密码,不是吗?除非连接到数据库,否则我无法从用户表中获取信息

另一个问题是,如何跟踪最后5个密码。该政策规定,用户不能使用最后5个已使用的密码中的任何一个

如果我可以得到一个解决方案,通知我的用户他们的密码将在'n'天内过期,并且他们必须在过期之前更改密码,那么所有这些都可以避免


其他开发人员在验证其用户时会做什么。请指导我

理想情况下,您应该使用现有的Active Directory基础结构来处理您对单个用户的身份验证/授权,然后您可以将最终用户的凭据通过web服务器传递到SQL server(您可能需要研究如何处理Kerberos“双跳问题”,以实现这一点)

但如果做不到这一点,很容易设置应用程序,使其自身具有SQL登录名来访问数据库,以便检索用户级身份验证信息。对用户密码的单向散列将确保即使从连接字符串读取应用程序的密码,也无法获取用户密码

或者在这两个解决方案之间的某个地方,应用程序在AD中有一个服务帐户,可以访问SQL数据库,以便从DB中检索用户帐户信息


无论哪种方式,如果AD可用,您都可以使用Kerberos进一步保护数据库安全,以确保仅从预期的端点(即ASP.NET服务器)访问数据库。

web应用程序中非常常见的情况是使用一个用户名/密码(因此只有一个sql登录,通常是对应用程序具有最低权限的专用登录). 这样,就可以使用连接池。这当然是一个后端帐户,在web.config中配置,最终用户不可见

用户作为应用程序中的一种数据类型进行维护。Asp.net附带了一个称为“成员资格”的解决方案。用户身份验证是针对成员资格提供程序进行的,有几个类为您提供了对身份验证、角色等的编程支持。例如,您可以使用AD作为提供程序,也可以使用表单身份验证。或者你也可以自己写


由于您现在为每个用户使用专用的sql登录,因此需要注意,这种方法将数据访问安全性提升到了应用程序级别。因此,这可能并不总是适合您的需要。

如果您将用户的登录凭据保存在数据库中,那么要访问sql server本身,您可能只需要对整个应用程序进行一次登录。此登录将具有对数据库的完全访问权限,因为这将由应用程序强制执行访问权限

如果你走这条路,你需要注意两件事:

  • 对于需要通过诸如reporting Services、Crystal Reports、Infomaker等工具向用户提供特别报告功能的大型应用程序,仍然存在安全问题。在这种情况下,用户可以使用这些报告工具获得对他们不应该能够看到的数据库区域的读取权限
  • 如果您为用户存储自己的凭据信息,则需要确保正确执行。这意味着没有明文密码。您需要一个加密安全的密码散列(而不是md5!)和每个用户的salt。如果你觉得这是希腊语,最好别管它

  • 对您开放的另一个选项是对数据库使用Active Directory/Windows身份验证。这里的诀窍是,您仍然必须为所有用户设置访问权限。但是,您可以使用Active Directory组来减少需要创建的登录数,这至少可以防止您手动重置Sql Server登录,因为用户将使用其Active Directory帐户登录。

    谢谢。。。我本可以使用广告,但审计员再次表示,当应用程序或网页打开时,必须输入登录详细信息。另外,ASP.NET成员身份不能与安装SQL server的同一服务器中定义的密码策略集成。或者,如果asp.net为我们提供了该功能,那么我不知道如何做好,关键是成员身份将用户完全移出sql server,因此除了应用程序正在使用的服务帐户之外,您不再使用sql server策略。。。在您的情况下,您可以使用表单身份验证,在这种情况下,用户始终必须输入用户名/密码,但这不是审计员想要的方式。他们想要有一个登录页面,所有这些用户都必须强制执行密码策略。你在你的成员资格提供程序中强制执行该策略。然后审计员就哑口无言了。您必须重新输入凭据的任何时候都有机会对其进行嗅探。任何时候,您必须重新实现一个身份验证系统,这都有可能使它发生微妙的错误。AD方法更安全,因为它依赖于经验证的系统,而不是让安全新手为每个应用重新实施身份验证。那么使用AD是否意味着一旦用户登录