none
当用户已经登录到域之后,如何可以让HttpWebRequest类请求一个url的时候不需要提供密码就能够访问? RRS feed

  • 问题

  • 问题是这样的:

    1、用户的局域网使用AD,所有人的计算机都是登录到AD上的

    2、用户另外使用一套OA,DOMINO平台,B/S架构,已经实现了和AD的单点登录,即登录到AD之后,可以直接访问这个OA而不需要再输入密码

    现在的问题是,我有一个用C#编写的客户端程序,通过HttpWebRequest类去访问这个OA系统获取一些数据,之前我的做法是:

                    request = (HttpWebRequest)WebRequest.Create(sLocation);
                    request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(sUserName + ":" + sPassword)));

    即直接将用户名和密码发送给HTTP服务器,但是现在由于使用了单点登录,我已经没有办法获取用户的密码了(在AD里面我获取不到,用户也不同意在我的程序中另外保存一份密码,这样会造成不同步的问题),请问这种情况下,怎样才可以让我的C#程序正常连接HTTP服务器?

     

     


    da jia hao!
    2010年7月15日 6:33

答案

  • 用 HttpWebRequest.Credentials 设置当前用户的凭据,或者设置 UseDefaultCredentials = true 试试看。如果是计算机在 AD 中,不需要设置凭据既可以实现正常的 NTLM 验证,对于 AD 集成第三方系统 SSO 的案例我没有遇到过,不过可以按照我说的方法试试看。
    Mark Zhou
    2010年7月15日 10:11
  • 如果是访问 Web 资源,利用 WebClient 的话,直接利用:

    WebClient wc = new WebClient(...);
    WebClient.UseDefaultCredentials = true;

    就好。它会直接在 HTTP Header 中加 www-authenticate 头标识。HttpWebRequest 也是一样。

    NTML 是一种在网络上运行 Microsoft Windows 的系统之间的基于 Challenge 的验证机制。详细请参考 http://msdn.microsoft.com/en-us/library/aa378749(VS.85).aspx


    Mark Zhou
    2010年7月19日 9:24

全部回复

  • 用 HttpWebRequest.Credentials 设置当前用户的凭据,或者设置 UseDefaultCredentials = true 试试看。如果是计算机在 AD 中,不需要设置凭据既可以实现正常的 NTLM 验证,对于 AD 集成第三方系统 SSO 的案例我没有遇到过,不过可以按照我说的方法试试看。
    Mark Zhou
    2010年7月15日 10:11
  • 顶一下,谢谢帮忙。
    da jia hao!
    2010年7月17日 19:45
  • 请问什么叫做“NTLM”验证?
    da jia hao!
    2010年7月17日 19:55
  • 我把问题简化一下:

    假设某用户已经登录到域(AD),此时他打开一个IIS服务器的页面应该是不需要输入密码的;

    但如果他使用一个C#编写的客户端程序,去连接这个IIS服务器下载东西,应该要如何写才能够实现这个功能呢?

    我之前没有使用域的时候一般都是将用户名和密码放在HTTP头里面发送给服务器:

    request = (HttpWebRequest)WebRequest.Create(sUrl);
    request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(sUserName + ":" + sPassword)));

    就想知道换成AD的环境之后,如何才能够让C#程序可以不用提供用户名和密码也能够获取到服务器的数据?


    da jia hao!
    2010年7月17日 20:06
  • 如果是访问 Web 资源,利用 WebClient 的话,直接利用:

    WebClient wc = new WebClient(...);
    WebClient.UseDefaultCredentials = true;

    就好。它会直接在 HTTP Header 中加 www-authenticate 头标识。HttpWebRequest 也是一样。

    NTML 是一种在网络上运行 Microsoft Windows 的系统之间的基于 Challenge 的验证机制。详细请参考 http://msdn.microsoft.com/en-us/library/aa378749(VS.85).aspx


    Mark Zhou
    2010年7月19日 9:24
  • 请问这一句:

    WebClient.UseDefaultCredentials = true;

    究竟实现了什么?我想如果要将系统中当前用户的身份验证信息发送给HTTP服务器,应该要先去获取这些相关的数据,然后再发送给HTTP服务器才对啊,就这么一句程序实在让我很困惑。。。。


    da jia hao!
    2010年7月22日 16:46
  • 这个说起来有点话长。大概的解释就是,Windows 有一种安全提供器,比如 NTLM Kerbos,它记录当前用户的安全信息 (SID) 和验证令牌 (Token),用 DefaultCredentials 登录时,将其 SID 和 Token 直接发送给服务器。因为服务器同样提供 Windows 验证,它就可以认识发送过来的 SID,从而从 Active Directory 上获取该用户是否已经登录。这个过程很直接,也避免了多次输入密码和在网络上传输密码的安全问题。
    Mark Zhou
    2010年7月23日 10:17