5

我有一个在我们的数据中心运行的 asp.NET Web 应用程序,我们希望客户在其中使用单点登录进行登录。如果我们可以使用 IIS 集成安全性,这将非常容易。然而我们不能这样做。我们不信任客户的域控制器。并且我们希望网站可用于一般互联网。只有当人们从客户端网络内连接时,他们才应该自动登录。

我们拥有的是域帐户列表和一种通过 LDAP 在 asp.net 代码中查询 DC 的方法。当 IIS 中允许匿名访问时,IIS 从不向浏览器询问凭据。因此我们的应用程序永远不会获得用户凭据。

有没有办法强制浏览器在 IIS 接受匿名请求的情况下发送凭据(从而能够使用单点登录)。

更新:

我尝试自己发送 401:未授权的 www-authenticate:NTLM 标头。接下来发生的事情(正如 Fiddler 告诉我的)是 IIS 完全控制并处理完整的请求链。正如我从各种来源了解到的那样,IIS 采用用户名,将质询发送回浏览器。浏览器返回加密响应,并且 IIS 连接到域控制器以使用此响应对用户进行身份验证。

但是,在我的场景中,IIS 与客户端位于不同的 Windows 域中,并且无法对用户进行身份验证。出于这个原因,建立一个启用了 Windows 身份验证的单独站点也不会奏效。

现在我必须留下我正在研究的选项:

  1. 在我们的托管域和客户域之间创建域信任(我们的 IT 部门对此不满意)
  2. 使用 NTML 代理将 IIS 身份验证请求转发到客户端域控制器(我们有一个 VPN 连接可用于通过 LDAP 连接)
4

3 回答 3

3

您要求的是混合模式身份验证。我最近使用了Paul Glavich 的两个入口点机制,它运行良好。我想这是解决这个问题的最优雅的解决方案。

于 2008-09-17T22:43:14.417 回答
0

不确定您是否可以轻松地使其正常工作。与基本的 401 挑战发生在用户请求的带内 - 这样凭据出现在标头中,NTLM 握手在单独的端口上完成 - 然后由非托管代码强制进入线程上下文。

您尝试在 VS2008(或反射器)中拆开 ASP.NET NTLM 模块,看看它是如何提取凭据的?

不是一个真正的答案 - 对不起......

于 2008-09-17T09:25:51.370 回答
-1

此解决方案是关于表单身份验证的,但它详细说明了 401 问题。

解决方案是简单地将处理程序附加到应用程序的 EndRequest 事件,方法是将以下内容放入 Global.asax:

protected void Application_EndRequest(object sender, EventArgs e) {
    if (Context.Items["Send401"] != null)
    {
         Response.StatusCode = 401;
         Response.StatusDescription = "Unauthorized";
    } }

然后,为了触发这个代码,你所要做的就是放一个

Context.Items["Send401"] = true;

编辑:
我已使用此方法启用匿名和集成来获取用户的域凭据。我不确定它是否适用于你的情况,但我认为我值得一试。

于 2008-09-17T15:48:08.003 回答