在ASP.NET中获取Windows /域凭据,同时允许IIS中的匿名访问
我在我们的数据中心中运行了一个ASP.NET Web应用程序,我们希望客户在该应用程序中进行单点登录。如果我们可以使用IIS集成安全性,那么这将非常容易。但是,我们不能这样做。我们不信任客户的域控制器。我们还希望网站可以在一般互联网上使用。只有当人们从客户端网络内部进行连接时,他们才应该自动登录。
我们拥有的是域帐户列表以及一种通过asp.net代码中的LDAP查询DC的方法。当IIS中允许匿名访问时,IIS永远不会向浏览器挑战凭据。因此,我们的应用程序永远不会获得用户凭据。
有没有一种方法可以强制浏览器通过IIS接受匿名请求来发送凭据(从而能够使用单点登录)。
更新:
我尝试自己发送401:未经授权的www-authenticate:NTLM标头。接下来发生的事情(正如Fiddler告诉我的那样)是IIS进行了完全控制并处理了完整的请求链。据我从各种来源了解到,IIS会使用用户名,将质询发送回浏览器。浏览器以加密的响应返回,并且IIS连接到域控制器以使用此响应对用户进行身份验证。
但是在我的情况下,IIS与客户端位于不同的Windows域中,并且无法对用户进行身份验证。因此,使用Windows认证建立一个单独的站点也不起作用。
现在,我必须选择要研究的选项:
- 在我们的托管域和客户域之间建立域信任(我们的IT部门对此不满意)
- 使用NTML代理将IIS身份验证请求转发到客户端域控制器(我们具有可通过LDAP连接的VPN连接)
解决方案
回答
不确定我们是否可以轻松地使它正常工作。与基本的401质询发生在用户请求的带内使得凭据出现在标头中不同,NTLM握手在单独的端口上进行,然后通过非托管代码强制进入线程上下文。
我们尝试将VS2008(或者反射器)中的ASP.NET NTLM模块拆开,以查看它如何提取凭据?
真的不是答案抱歉...
回答
此解决方案是关于表单身份验证的,但它详细介绍了401问题。
The solution was simply to attach a handler to the Application's EndRequest event by putting the following in Global.asax:
protected void Application_EndRequest(object sender, EventArgs e) { if (Context.Items["Send401"] != null) { Response.StatusCode = 401; Response.StatusDescription = "Unauthorized"; } }
Then, in order to trigger this code, all you have to do is put a
Context.Items["Send401"] = true;
编辑:
我已在启用"匿名和集成"的情况下使用此方法来获取用户的域凭据。我不确定它是否适合情况,但我认为值得一试。
回答
我们要求的是混合模式身份验证。我最近使用了Paul Glavich的两个切入点机制,它运作良好。我想这是解决这个问题的最优雅的解决方案。