繁体   English   中英

在asp.net中获取Windows /域凭据,同时允许在IIS中进行匿名访问

[英]Getting windows/domain credentials in asp.net while allowing anonymous access in IIS

我在我们的数据中心运行了一个asp.NET webapplication,我们希望客户通过单点登录进行登录。 如果我们可以使用IIS集成安全性,这将非常容易。 但是我们不能这样做。 我们对客户的域控制器没有信任。 我们希望网站可用于一般互联网。 只有当人们从客户网络中连接时,他们才会自动登录。

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

有没有办法强制浏览器发送凭据(因此能够使用单点登录)与IIS接受匿名请求。

更新:

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

但是在我的方案中,IIS与客户端位于不同的Windows域中,无法对用户进行身份验证。 因此,建立一个带有Windows身份验证功能的独立站点也无法正常工作。

现在我需要选择我正在研究的选项:

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

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

不确定你是否能轻松实现这一目标。 与401挑战发生在用户请求的带内基本不同 - 这样,信用证出现在标题中,NTLM握手在一个单独的端口上完成 - 然后由非托管代码强制进入线程上下文。

你试图拆开VS2008(或反射器)中的ASP.NET NTLM模块,看看它是如何提取信用卡的?

不是真的答案 - 对不起......

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

解决方案只是通过将以下内容放在Global.asax中来将处理程序附加到Application的EndRequest事件:

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

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

Context.Items["Send401"] = true;

编辑:
我已经使用此方法打开Anonymous和Integrated来获取用户的域凭据。 我不确定它是否适用于你的情况,但我认为我值得一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM