Javascript 将用户的Active Directory凭据发送到后端系统是否错误

Javascript 将用户的Active Directory凭据发送到后端系统是否错误,javascript,c#,asp.net-web-api,active-directory,Javascript,C#,Asp.net Web Api,Active Directory,今天,我不得不查看一个内部网站的一些代码,该网站是一个javascript表单,带有一个C#WebAPI,它将广告用户名和密码(在登录时)发送到后端,然后作为该用户针对广告登录以检查其有效性。(这一切都是免费的) 我的评论是,这相当于制作一个带有facebook徽标、用户名和密码的表单,并要求用户使用该表单登录您的网站,然后自己登录facebook,检查facebook凭据是否有效。所以钓鱼和中间人都一样,如果我们在我们的web应用程序中拥有所有用户的所有广告凭证,那么就可以在任何地方以该用户的

今天,我不得不查看一个内部网站的一些代码,该网站是一个javascript表单,带有一个C#WebAPI,它将广告用户名和密码(在登录时)发送到后端,然后作为该用户针对广告登录以检查其有效性。(这一切都是免费的)

我的评论是,这相当于制作一个带有facebook徽标、用户名和密码的表单,并要求用户使用该表单登录您的网站,然后自己登录facebook,检查facebook凭据是否有效。所以钓鱼和中间人都一样,如果我们在我们的web应用程序中拥有所有用户的所有广告凭证,那么就可以在任何地方以该用户的身份登录并执行所有操作

然而。。。讨论从开发团队开始,论点是

  • 它可以工作,为什么不呢(没有什么会出错,这是内联网)
  • stackexchange上也有示例,例如: ) . 因此,对于这个例子,我假设这只在特定的情况下使用,而不会在web情况下使用
  • 当您要用某种语言编写桌面应用程序时,您还需要以某种方式根据AD验证自己
  • 这是模拟的完美例子:我们模拟每一个用户(在这方面我会考虑更多)
  • 如果我们要将我们的程序扩展到用户可以更改其ad密码的点,我们将需要新密码(和域管理员凭据),因此这是相同的(我认为您将始终重置等)
  • 因此,这带来了疑问。我的想法是(显然是针对广告而非广告)

    • 用户登录Windows
    • 用户打开浏览器到URL
    • IIS配置为打开Windows身份验证的站点
    • 浏览器和IIS进行协商(其中浏览器与Windows层通信)
    • 用户是否有效>继续

    据我所知,这是最佳做法(stackexchange上的大量链接,例如,和web上的链接)。

    应用程序不应能够拦截用户密码

    因此,现代web和移动应用程序将身份验证过程与SAML IDP或OAuth2授权服务器/OpenID提供者分开

    如果客户端和应用程序都是域连接的,则本机windows应用程序可以使用

    上述所有技术使应用程序能够获得经过验证的用户身份,同时无需将用户名和密码直接传输到应用程序

    这相当于制作一个带有facebook徽标、用户名和密码的表单,并要求用户使用该表单登录您的站点,然后自己登录facebook

    因为信任的问题,这不是一个准确的类比。你的公司不是Facebook

    您的应用程序正在向您公司的员工询问他们访问公司内部Active Directory的凭据。那里有信任。这更像是一个由Facebook运行的网站,要求您提供Facebook凭据

    这并不是说没有安全问题。Windows身份验证是最好的方式,这不仅是因为您没有与任何其他应用程序共享密码,而且还因为它易于使用。如果设置正确,用户将自动登录,而无需输入用户名和密码。这让用户感到高兴

    但是,如果您需要对外部域进行身份验证,则这不起作用。在那里我设置了一个登录表单来收集广告用户名和密码。我们的一些网站需要允许来自外部广告域的用户登录(在没有广告信任的情况下),因此我通过HTTPS获取用户名和密码,并通过LDAPS对外部域进行身份验证。但是,我们不存储密码。一旦我们用外部域验证了凭据,我们就用用户名创建表单身份验证令牌,然后忘记密码


    如果你在自己的数据库中存储广告密码,那么我认为这是最大的问题。如果任何人拥有该数据库,那么您的所有用户都可以在组织中的任何其他地方进行模拟。

    请注意,征求意见在这里是不相干的。但是,如果需要对用户进行身份验证,您还会做什么?这里没有。我已经添加了在大约3000万个windows身份验证和iis站点上的最佳实践。在我们的案例中,我们为公司提供了一个仅基于prem的解决方案。因此,我们要求公司信任我们,我们不会利用用户的广告凭证做坏事。因为代码是关闭的。总的来说,我认为你这样说是因为,例如,要登录到外部域,你需要这些情况下的凭据。然后可以扩展到为什么不在内部和外部域中使用它,让一个组件通用地处理这个问题。反对这一点的理由是,自动单点登录windows身份验证更加用户友好。(因此,就“信任”而言,我们的应用程序在贵公司内部运行,但不是贵公司的应用程序)事实上,它的第三方软件改变了一些事情,但这仍取决于各公司的决定。使用用户名和密码并通过LDAP进行身份验证并不少见,只要它不存储密码即可。Windows身份验证更方便用户,但在这种情况下也更安全。我们首先尝试Windows身份验证,如果失败,则返回登录页。我刚才在另一个回答中描述了我是如何做到这一点的: