一个网络编程解决问题的例子

来源:互联网 发布:2013年十大网络流行语 编辑:程序博客网 时间:2024/05/23 01:22
 局域网自动登录
其实我是要在程序中访问一个内部网站,但这个网站会弹出一个登录对话框提示输入“用户名”和“密码”。

这个对话框是标准的windows登录对话框,就像通过 \\10.70.1.8 这种方式访问局域网中某台机器时弹出的对话框一样,所以我将标题取为“局域网自动登录”。

我有用户名和密码,我希望在程序中能实现自动登录,因为只有登录后我才能访问内部网站。用户名是: 域名\用户 这样的形式(我是XP的系统)。

搜索了一下已有的帖子,都是讲在网页中通过post方法实现网页登录的,和我这个不一样。

请教各位,高分相谢!
有不清楚我问题的跟帖,谢谢。 回复内容【renjun24】:
不懂,学习来了,帮顶吧
你能给我一分就不错了,谢谢!

【xuexijinrong】:
用 windows2k, 2003里面的域登陆解决你的问题.


【xiao_fang】:
谢谢捧场。

解释一下,我要访问的网址是:http://10.70.1.8
在浏览器中可进入这个页面,但页面上有个登录按钮,点击后就弹出类似局域网登录的对话框,可能是对应的链接设置了保护。

我可以在本机的“运行”对话框中通过“\\10.70.1.8”直接访问这台机器无需输入密码(但也看不到任何内容),然后再以http://10.70.1.8 进入浏览器点“登录”按钮还是会要求输入用户及密码。

【wangk】:
用模拟按键的方式试试?

【CathySun118】:
这个比较难,类似黑客程序。

【vieri_ch】:
我用HttpOpenRequest测试了一下
这样的方式属于非匿名登录。如果你已经有了用户名和密码
http://10.70.1.8这个页面上的按钮肯定是指向了一个新的链接,而该链接是一个非匿名登录的地址,你需要取得这个地址,这个应该没有什么问题

在使用WININET或者mfc的方式向该链接提交的时候,需要做以下工作
TCHAR customheader1[]=_T("Accept-Language: zh-cn");
TCHAR customheader2[]=_T("UA-CPU: x86");
TCHAR customheader3[]=_T("Accept-Encoding: gzip, deflate");
TCHAR customheader4[]=_T("Connection:Keep-Alive");
TCHAR customheader5[]=_T("Authorization: Basic YWRtaW5pc3RyYXRvcjptttttttttt==");
//注意这一个header,这是认证登录的header,basic空格后面的就是你的(用户名:密码)的BASE64位编码,这里我省去了Base64编码的函数,你可以从网上找到很多,把这个header添加到request header中,就可以实现类似windows认证方式的登录网站


hURL = HttpOpenRequest(hConnect,"GET",strObject,
HTTP_VERSION,lpreferer,
szTempX,   INTERNET_FLAG_EXISTING_CONNECT|
INTERNET_FLAG_NO_AUTO_REDIRECT|
INTERNET_FLAG_DONT_CACHE|
INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_AUTH ,0) ;

HttpAddRequestHeaders(hURL,customheader1,_tcslen(customheader1),HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(hURL,customheader2,_tcslen(customheader2),HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(hURL,customheader3,_tcslen(customheader3),HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(hURL,customheader4,_tcslen(customheader4),HTTP_ADDREQ_FLAG_ADD);
HttpAddRequestHeaders(hURL,customheader6,_tcslen(customheader5),HTTP_ADDREQ_FLAG_ADD);

HttpSendRequest(hURL,NULL,0,0,0);

这些代码省去了一些前面的步骤,只是简要说明应该在request header中加入认证字段的方式
如果你用匿名登录方式,提交请求之后,得到response应该401,访问被拒绝,使用这段代码登录就可以得到200的成功response

【samwzhang】:
'给你一段VB程序,你自己翻译成VC的
Private Type NETRESOURCE
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    pLocalName As Long
    pRemoteName As String 'Long
    pComment As Long
    pProvider As Long
End Type
Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Public Sub ConnectServerShare(ServerName As String, UserName As String, PassWord As String) '对于一些必须连接一次服务器才能连接的的计算机采用先用程序连一次的方法
    On Error Resume Next
    Dim LL As NETRESOURCE
    With LL
        .pRemoteName = "\\" & ServerName
        .dwType = 0
    End With
    WNetAddConnection2 LL, PassWord, UserName, 0
End Sub


【samwzhang】:
不过我觉得更关键的问题是你服务端的设置有问题,你先检查一下服务端的设置,可能设置对了以后客户端根本不用登陆就可以使用。

【loomman】:
如果没有加密的话,可以先用WPE截获手工登陆过程中收发的所有报文,有了这些报文,你就可以直接与局域网服务器进行模拟报文收发,效果是一样的.
如果有加密的话,那么就比较麻烦了,你需要先解密,再模拟登陆.

【s26976】:
不懂

【chehw】:
网站可能用了集成Windows验证的方式。
可以用冒名(Impersonate)的方式试一下:
LogonUser 
ImpersonateLoggedOnUser
//...
RevertToSelf

【xiao_fang】:
to samwzhang:你误解了我的意思,我并不希望客户端不用登录,那是不安全的。我只是希望能在程序中实现自动登录。

to loomman:解决这类问题的一般思路。
我先试试vieri_ch的方法,不行再分析一下数据包。

谢谢各位。

【samwzhang】:
To LZ:
我给的WNetAddConnection2函数就是用来进行局域网登陆的啊,你改成VC的格式就能用啊。

【xiao_fang】:
我也会试一下你的方法,谢谢你

【vieri_ch】:
补充一点
如果目标链接不允许匿名访问

采用集成windows认证的话,可能就需要用chehw(chehw) 的方法
若是基本身份验证,就可以用username:password然后base64编码,再构造header
Authorization: Basic YWRtaW5pc3RyYXRvcjptttttttttt==
即可
这个也是我抓包得来的

【xiao_fang】:
谢谢大家的帮助。

刚才我抓包看了一下,认证好像是:Authorization: Negotiate

明天再仔细分析一下~

【ReverseEngineering】:
学习,关注

【vieri_ch】:
NTLM认证

【xiao_fang】:
vieri_ch,你说的没错,我看了包中有以下数据:

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Thu, 29 Mar 2007 01:59:31 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="10.70.1.8"
Connection: close
Content-Length: 0
Content-Type: text/html

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Thu, 29 Mar 2007 01:59:35 GMT
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAFgAWADgAAAAFgomiZT2FiBadtZwAAAAAAAAAAJQAlABOAAAABQCTCAAAAA9DAEgASQBOAEEATQBPAEIASQBMAEUAAgAWAEMASABJAE4AQQBNAE8AQgBJAEwARQABABYASgBMAFcAWgAtAEEAUABQAFMAUgBWAAQAHgBjAGgAaQBuAGEAbQBvAGIAaQBsAGUALgBjAG8AbQADADYASgBMAFcAWgAtAEEAUABQAFMAUgBWAC4AYwBoAGkAbgBhAG0AbwBiAGkAbABlAC4AYwBvAG0AAAAAAA==
Content-Length: 0
Content-Type: text/html

上面“Negotiate”后面一串加密串解码后是:NTLMSSP

但是我还是不知道如何做,请指导一下。

【xiao_fang】:
网上找了一些NTLM方面文章,学习中。。。
http://www.xfocus.net/releases/200305/a533.html
http://hedong.3322.org/archives/000311.html

【samwzhang】:
你先用WNetAddConnection2登陆,然后访问网页获取数据,然后再用WNetAddConnection2关闭,局域网内这样做是很方便的,不过广域网上用不起来。
WNetAddConnection2的作用=cmd[ 控制台、命令行]下的DOS命令:
Net Use \\IP "Password" /u:"User" ______这是连接登陆
Net Use \\IP /delete ________这是退出登陆
这两个DOS命令均可以用API函数WNetAddConnection2实现。

【vieri_ch】:
你已经有了用户名和密码,那么也可以抓取到成功的登陆的Request Header
以及那段信息
你现在贴出来的是访问被拒绝的信息



【michney】:
不专业,帮顶

【xxaxxaxxa】:
帮顶


【xiao_fang】:
谢谢samwzhang,我在命令行窗口用net use命令试过,但提示错误:
发生系统错误 53。
找不到网络路径。


【samwzhang】:
server服务被停用了,我再想想怎么解决。
要不你试下Hook看看能不能起作用。

【samwzhang】:
GetHttpConnection
------------------
CInternetSession::GetHttpConnection
CHttpConnection* GetHttpConnection( LPCTSTR pstrServer, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL );
Throw ( CInternetException );

CHttpConnection* GetHttpConnection( LPCTSTR pstrServer, DWORD dwflags, INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL );
Throw ( CInternetException );

Return Value

A pointer to a CHttpConnection object. If the call fails, determine the cause of the failure by examining the thrown CInternetException object.

Parameters

pstrServer

A pointer to a string containing the HTTP server name.

nPort

A number that identifies the TCP/IP port to use on the server.

pstrUserName

A pointer to a string containing the user name.

pstrPassword

A pointer to a string containing the access password.

dwflags

The flags describing

Remarks

Call this member function to establish an HTTP connection and get a pointer to a CHttpConnection object.

GetHttpConnection connects to an HTTP server, and creates and returns a pointer to a CHttpConnection object. It does not perform any specific operation on the server. If you intend to query an HTTP header, for example, you must perform this operation as a separate step. See the classes CHttpConnection and CHttpFile for information about operations you can perform by using a connection to an HTTP server. For information about browsing an HTTP site, see the member function OpenURL. See the articleInternet Programming with WinInet in Visual C++ Programmer’s Guide for steps in performing common HTTP connection tasks.

CInternetSession Overview |  Class Members |  Hierarchy Chart

See Also   CHttpConnection, CInternetSession::GetGopherConnection, CInternetSession::GetFtpConnection, CInternetSession::OpenURL


【samwzhang】:
关键是:你说的这个登陆框根本不是网页上的设置,而是由于你的服务器和WEB服务配置不当造成的,换句话说这个登陆框是系统登陆框,要解决,肯定要从系统角度去考虑。

【xiao_fang】:
以下是登录成功全过程中抓下来的包,前两次都失败,第三次不知为何能成功,好像和第二次也差不多。
(写了个小程序用winpcap抓包,好不容易才过滤出来,呵呵):
GET /default.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FDM; .NET CLR 2.0.50727)
Host: 10.70.1.8
Connection: Keep-Alive
Cookie: JLWZ%5FNOTIFY%5FSelect%5FCondition=

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Thu, 29 Mar 2007 04:29:55 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="10.70.1.8"
Connection: close
Content-Length: 0
Content-Type: text/html

GET /default.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FDM; .NET CLR 2.0.50727)
Host: 10.70.1.8
Connection: Keep-Alive
Cookie: JLWZ%5FNOTIFY%5FSelect%5FCondition=
Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw==

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Thu, 29 Mar 2007 04:30:00 GMT
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAFgAWADgAAAAFgomialmsMhC9fZ0AAAAAAAAAAJQAlABOAAAABQCTCAAAAA9DAEgASQBOAEEATQBPAEIASQBMAEUAAgAWAEMASABJAE4AQQBNAE8AQgBJAEwARQABABYASgBMAFcAWgAtAEEAUABQAFMAUgBWAAQAHgBjAGgAaQBuAGEAbQBvAGIAaQBsAGUALgBjAG8AbQADADYASgBMAFcAWgAtAEEAUABQAFMAUgBWAC4AYwBoAGkAbgBhAG0AbwBiAGkAbABlAC4AYwBvAG0AAAAAAA==
Content-Length: 0
Content-Type: text/html

GET /default.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FDM; .NET CLR 2.0.50727)
Host: 10.70.1.8
Connection: Keep-Alive
Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAIYAAAAYABgAngAAABYAFgBIAAAACgAKAF4AAAAeAB4AaAAAAAAAAAC2AAAABYKIogUBKAoAAAAPYwBoAGkAbgBhAG0AbwBiAGkAbABlAGMAcwA1ADcAMQBPAEYATgBJAEEASQBTAEEALQBCAEUAQwBCADQARgBqpVOjTZr//QAAAAAAAAAAAAAAAAAAAACmtxMAjUbVSrJoRUQ+uFpvoeh2E7gxllE=
Cookie: JLWZ%5FNOTIFY%5FSelect%5FCondition=

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 29 Mar 2007 04:30:00 GMT
X-Powered-By: ASP.NET
Content-Length: 12933
Content-Type: text/html
Set-Cookie: ASPSESSIONIDAQCQDQSC=HJLFDPFBLJFAMPGOGDDGMAGO; path=/
Cache-control: private


<META....
下面是登录成功后的网页内容

【vieri_ch】:
测试已经成功,步骤如下
前提:
1。目标URL链接使用了NTLM认证
2。需要你知道用户名和密码
3。首先需要你用浏览器使用帐户登陆之后,获取抓包的Request Header

NTLM认证的登陆通过三次request得到
第一次request,不需要任何附加header,response应答

GET /aichi/introduce.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 10 Mar 2007 09:22:10 GMT
If-None-Match: "46509094f562c71:960"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Thu, 29 Mar 2007 05:06:05 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Connection: close
Content-Length: 3964
Content-Type: text/html

【vieri_ch】:
第二次request,增加header,这个header从使用IE登陆的时候包中获取
Authorization: Negotiate TlRMTVNTUAABAAAAB7IIogkACQArAAAAAwADACgAAAAFASgKAAAAD01KRldPUktHUk9VUA==

GET /aichi/introduce.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 10 Mar 2007 09:22:10 GMT
If-None-Match: "46509094f562c71:960"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
Authorization: Negotiate TlRMTVNTUAABAAAAB7IIogkACQArAAAAAwADACgAAAAFASgKAAAAD01KRldPUktHUk9VUA==

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Thu, 29 Mar 2007 05:06:05 GMT
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAABgAGADgAAAAFwoqicFwGBKjuYd8gsBUAAAAAACwALAA+AAAABQEoCgAAAA9NAEoARgACAAYATQBKAEYAAQAGAE0ASgBGAAQABgBtAGoAZgADAAYAbQBqAGYAAAAAAA==
Content-Length: 3715
Content-Type: text/html


【vieri_ch】:
第三次request,增加header,这个header从的二次request的应答中获取
Authorization: Negotiate TlRMTVNTUAABAAAAB7IIogkACQArAAAAAwADACgAAAAFASgKAAAAD01KRldPUktHUk9VUA==

GET /aichi/introduce.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 10 Mar 2007 09:22:10 GMT
If-None-Match: "46509094f562c71:960"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
Authorization: Negotiate TlRMTVNTUAADAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAABcKIogUBKAoAAAAP

HTTP/1.1 304 Not Modified
Server: Microsoft-IIS/5.1
Date: Thu, 29 Mar 2007 05:06:05 GMT
X-Powered-By: ASP.NET
ETag: "46509094f562c71:960"
Content-Length: 0


【zfive5】:
DWORD WNetAddConnection2(
  LPNETRESOURCE lpNetResource,
  LPCTSTR lpPassword,
  LPCTSTR lpUsername,
  DWORD dwFlags
);


【vieri_ch】:
现在我们需要的就是第三次的header,通过抓包得到的
Authorization: Negotiate TlRMTVNTUAADAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAABcKIogUBKAoAAAAP


在程序里我们要这样做,得到这个header我们就可以在程序一次request完成整个登陆,因为API底层会自动分成三次的

TCHAR *customheader[]={_T("Accept-Language: zh-cn")
,_T("UA-CPU: x86")
,_T("Accept-Encoding: gzip, deflate")
,_T("Connection:Keep-Alive")
,_T("Authorization: Negotiate TlRMTVNTUAADAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAABcKIogUBKAoAAAAP")
};

long lheader=sizeof(customheader)/sizeof(TCHAR *);
//认证登录方式
hURL = HttpOpenRequest(hConnect
,"GET"
,strObject,
HTTP_VERSION
,lpreferer,
szTempX,
INTERNET_FLAG_KEEP_CONNECTION  |
INTERNET_FLAG_EXISTING_CONNECT |
INTERNET_FLAG_NO_AUTO_REDIRECT |
INTERNET_FLAG_NO_COOKIES  
,0) ;
//注意上面这个选项中INTERNET_FLAG_KEEP_CONNECTION必须使用,这也是我之前屡次失败的主要原因,另外就是INTERNET_FLAG_NO_AUTH不能使用,原因就是它会自动尝试非认证登陆

for(int hdrIndex=0;hdrIndex<lheader;hdrIndex++)
{
HttpAddRequestHeaders(hURL,customheader[hdrIndex],_tcslen(customheader[hdrIndex]),HTTP_ADDREQ_FLAG_ADD);
}

HttpSendRequest(hURL,NULL,0,0,0);

//后面就是取得内容的部分了
HttpQueryInfo(hURL,HTTP_QUERY_STATUS_CODE,szTemp,&dwLen,NULL);
//登陆成功,状态应该是200
//取得登陆成功之后的真实网页内容
HttpQueryInfo(hURL,HTTP_QUERY_CONTENT_LENGTH,szTemp,&dwLen,NULL);



【xiao_fang】:
还是有些不明白:
1,用户名及口令何处输入?
2,第二、三次的header中那一串base64加密的内容我解开看都是“NTLMSSP”,但字串与上一次不同,这里面有何奥妙?


【xiao_fang】:
参考你的方法,我得到的状态是:401
:(

【xiao_fang】:
我对比了两次成功登录过程中的数据包,发现两次登录中,以下两处是不同的:
1。第二次服务端返回的“WWW-Authenticate: Negotiate”后的数据
2。第三次客户端请求的“Authorization: Negotiate”后的数据

我估计第三次请求的数据和第二次服务端返回的数据是有关联的。

【microyzy】:
LZ问题解决了吗?我也参合参合,因为我们公司的内部网站也要输入域帐号和密码,这样,改天也写个自动登录程序,省事了,呵呵

没做过这种程序,以我的理解,我觉得可能不需要抓包,应该是HTTP那边对部分网页做了需要用户验证的设置,IE的过程应该是这样的:
1)IE访问需要验证的网页
2)由于默认下没有用户信息,因此http server返回一个错误信息,大概应该是验证失败之类的,可能还会包含一些额外的信息,例如验证方式、加密方式(不确认,应该属于HTTP协议的范围)
3)IE弹出要求输入帐号密码的对话框,从用户那里获得帐号,然后用2)指定的方式,再次向http server 提出请求
4)http server 返回请求的网页
PS,验证方式是NTLM,那边应该是IIS server咯?

LZ要是搞定了,贴下代码,俺借用一下,要是明天还没解决,我也参合下,先写报告去:)

【xiao_fang】:
NTLM认证中服务器与客户端的会话过程基本清楚了:
1.当WEB服务器不允许匿名访问,而我们又没有提供正确的用户名/密码时,服务器就会给出这个返回代码:401 (Access Denied);

2.当我们在输入了用户名和密码以后,服务器与客户端会再进行两次对话。首先客户端向服务器索取一个公钥,服务器端会返回一个公钥,二者都用BASE64编码;
3。客户端拿到公钥之后使用公钥对用户名和密码进行加密码,然后把加密以后的结果重新发给服务器。

现在不清楚的就是第三步是如何加密的,研究中。。。

参见:
http://blog.csdn.net/songthin/archive/2006/05/31/766787.aspx


【vieri_ch】:
可能我的代码还是没有成功,因为我是在本机测试,第二次返回和第三次的请求之间会有关联。我这里测试条件不足,哪一位有必须认证登录的站点可以测试抓包?


【Red_angelX】:
帮顶

【xiao_fang】:
M$对NTLM的解释:

集成 Windows 身份验证
集成 Windows 身份验证(以前称为 NTLM 或 Windows NT 质询/响应验证)是一种安全的验证形式,因为在通过网络发送用户名和密码之前,先将它们进行哈希计算。当启用集成 Windows 身份验证时,用户的浏览器通过与 Web 服务器进行密码交换(包括哈希)来证明其知晓密码。集成 Windows 身份验证是 Windows Server 2003 家族成员中使用的默认验证方法。

集成 Windows 身份验证使用 Kerberos v5 验证和 NTLM 验证。如果在 Windows 2000 或更高版本域控制器上安装了 Active Directory 服务,并且用户的浏览器支持 Kerberos v5 验证协议,则使用 Kerberos v5 验证,否则使用 NTLM 验证。

集成 Windows 身份验证包括 Negotiate、Kerberos 和 NTLM 验证方法。Negotiate(Kerberos 和 NTLM 的包装)非常适用于连接 Internet 上的客户端,因为这两种验证方法均缺少某个功能(如下所示):

NTLM 可以通过防火墙,但通常会被代理服务器挡住。 
Kerberos 可以通过代理服务器,但通常会被防火墙挡住。 
要成功地进行 Kerberos v5 验证,客户端和服务器都必须可靠地连接到密钥分配中心 (KDC),并且必须与 Active Directory 服务兼容。

http://doc.51windows.net/iismmc/?url=/iismmc/htm/sec_encryp_aboutencryp.htm



【xiao_fang】:
更多资源:
http://blog.csdn.net/chaojibenben/archive/2006/11/22/1404945.aspx
http://blog.csdn.net/chaojibenben/archive/2006/11/22/1404955.aspx
http://www.ttian.net/article/show.php?id=6

这其中的加密处理还是有些麻烦的,M$总是把简单的问题复杂化。
WWW.XFOCUS.NET上有好多相关文章,但今天访问这个网站被重定向到百度的一个网址上去了(被黑了?)


有兴趣的还可直接看httpclient/apache/firefox等开源工程的相关源码。

【microyzy】:
http://www.acejoy.com/Html/Article/network/6620061103183849_P2.html

这里有ms提供的一些API

【tomtom123】:
mark

【xiao_fang】:
胜利在望,推荐一篇最佳介绍文档:
NTLM Authentication Scheme for HTTP
http://www.innovation.ch/personal/ronald/ntlm.html

【king110_1】:
d

【xiao_fang】:
分享一下最近看的一些相关文章:

http://www.cpcwedu.com/Document/mssecurity/111332993.htm

http://meta.cesnet.cz/cms/opencms/en/docs/software/devel/draft-brezak-spnego-http-04.txt

http://msdn2.microsoft.com/en-us/library/ms995330.aspx

【Mackz】:
其实,只要用域内的用户名、密码登录到Windows网络就不会在网页上出现登录对话框了。

【xiao_fang】:
但如果要在程序中实现就不是那么简单了:)

简单介绍一下这个过程:
客户端请求服务器上受保护内容时,服务器返回401错误同时返回服务器支持的全部认证方式,像我访问的这个WEB服务器返回了以下三种认证方式(Basic, NTLM, Negotiate):
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="10.70.1.8"
客户端在服务器返回的认证方式中,选择一种支持的方式进行认证。因此可能是以上三种之一,程序中都要支持。

这三种方式中,Basic是最简单的,只是把用户名和密码简单的进行MIME编码后就传到服务器进行认证;

NTLM稍复杂,这方面的介绍文档很多,一些邮件服务器也支持NTLM认证。这个我现在也搞清楚了,也通过了测试。

Negotiate方式是最复杂的一种(正是我的机器采用的认证方式),是SPNEGO-based Kerberos认证。

我看到的基本都是英文的文档,还在研究中:

关于Kerberos认证可看:
The Kerberos Network Authentication Service (V5)
http://www.ietf.org/rfc/rfc1510.txt
http://msdn2.microsoft.com/en-us/library/ms995329.aspx

SPNEGO-based Kerberos and NTLM HTTP Authentication in Microsoft Windows
http://www.apps.ietf.org/rfc/rfc4559.html
http://meta.cesnet.cz/cms/opencms/en/docs/software/devel/draft-brezak-spnego-http-04.txt
http://www.ietf.org/rfc/rfc2478.txt

【microyzy】:
佩服lz下,自汗下自己的三分热情。。。

Mackz说的对,不过如果用的是笔记本,又经常在外,还是得用lz的程序才好
原创粉丝点击