我在我们的数据中心运行了一个asp.NET webapplication,我们希望客户通过单点登录进行登录。如果我们可以使用IIS集成安全性,这将非常容易。但是我们不能这样做。我们对客户的域控制器没有信任。我们希望网站可用于一般互联网。只有当人们从客户网络中进行连接时,他们才会自动登录。
我们拥有的是域帐户列表以及在asp.net代码中通过LDAP查询DC的方法。在IIS中允许匿名访问时,IIS永远不会向浏览器挑战凭据。因此,我们的应用程序永远不会获得用户凭据。
有没有办法强制浏览器在IIS接受匿名请求时发送凭据(因此能够使用单点登录)。
更新:
我尝试自己发送401:未经授权,www-authenticate:NTLM标头。接下来发生的事情(正如Fiddler告诉我的那样)是IIS完全控制并处理完整的请求链。据我从各种来源了解,IIS采用用户名,将挑战发送回浏览器。浏览器返回加密的响应,IIS连接到域控制器以使用此响应对用户进行身份验证。
但是在我的方案中,IIS与客户端位于不同的Windows域中,无法对用户进行身份验证。因此,建立一个带有Windows身份验证功能的独立站点也无法正常工作。
现在我需要选择我正在研究的选项:
答案 0 :(得分:3)
您要求的是混合模式身份验证。我最近使用了two entry-point mechanism from Paul Glavich,它运行得很好。我想这是解决这个问题最优雅的解决方案。
答案 1 :(得分:0)
不确定您是否可以轻松实现此功能。与401挑战发生在用户请求的带内基本不同 - 这样,信用证出现在标题中,NTLM握手在一个单独的端口上完成 - 然后由非托管代码强制进入线程上下文。
您是否尝试拆分VS2008(或反射器)中的ASP.NET NTLM模块以查看其提取信用的功能?
不是真的答案 - 对不起......
答案 2 :(得分:-1)
This solution是关于表单身份验证,但它详细说明了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;
编辑:
我已经使用此方法打开Anonymous和Integrated来获取用户的域凭据。我不确定它是否适合你的情况,但我认为我值得一试。