【发布时间】:2012-04-11 03:41:18
【问题描述】:
我有以下配置:
- IIS 7.5
- 网站 A - 身份验证:禁用所有选项,仅 windows 启用身份验证。
- 应用程序 B(作为 A 的子 Web 应用程序):身份验证:启用匿名、启用基本、禁用 Windows 身份验证。
运行 ASP.NET 4 的两个应用程序,独立的应用程序池,经典模式。
现在,应用程序 B 出现了我在 Fiddler 中注意到的这种奇怪行为。 对于一个 aspx 页面的每个请求,它显示两个条目: 第一个请求:
GET https://example.com/page.aspx HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://example.com/
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Zune 4.7)
Cookie: ASP.NET_SessionId=123456789
Accept-Encoding: gzip, deflate
Host: example.com
Authorization: NTLM DFGHJKLDRFGHNXAAAAA==
Connection: Keep-Alive
Cache-Control: no-cache
Content-Length: 0
作为响应,我收到 401。然后,对同一资源发出第二个请求:
GET https://example.com/page.aspx HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://example.com/
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Zune 4.7)
Authorization: Basic ZXVyasdasdasdasdasdasd=
Accept-Encoding: gzip, deflate
Host: example.com
Connection: Keep-Alive
Cache-Control: no-cache
Content-Length: 0
Cookie: ASP.NET_SessionId=lasdasdasdasdasdasdasd
第二个没问题,状态为 200。
不同之处在于“授权”行,第一个显示 NTLM(给予 401 访问被拒绝)有时会导致 javascripts 的意外行为,例如带有更新面板 (Sys.WebForms.PageRequestManagerParserErrorException)。
我错过了什么?如何设置 IIS(或 webapp)不发出第一个“NTLM”请求? 感谢您的帮助。
编辑:我注意到的另一个有趣的问题:在相同的环境中,我有第二组这些应用程序(只是绑定到另一个数据库)。在这个集合中,应用程序 A 启用了匿名身份验证、启用了表单并禁用了窗口。 App B 的设置与第一组相同。在这种情况下,没有失败的请求 (401)。一切顺利。
【问题讨论】:
-
您说应用 B 是应用 A 的“子应用” - 应用 B 真的是应用 A 的子目录吗?
-
@kpcrash 它是 IIS 中的子应用(虚拟目录),在文件系统上有单独的目录。
-
之所以问是因为除非有什么改变,否则该子目录将在安全性方面从父目录继承。所以首先它是尝试父级的安全方法,然后实现子应用设置并尝试 - 考虑将子应用移动到它自己的应用文件夹?
-
不幸的是,我必须将此应用程序保留为 A 的子应用程序。但是,正如我在上面编辑后的帖子中添加的那样,似乎父级的 windows 身份验证似乎导致了问题。是有什么方法可以强制它不从 A 继承这个设置?
-
完全正确 - 期望第二组能够以这种方式工作,因为它们都具有相同的设置。