2

笔记:

与以前的修订版相比,这个问题的范围扩大了。我试图简化这个问题,以便任何人都可以轻松地复制它。

使用Fiddler,我可以在从 HTTP 请求中删除我的标头后将任意请求重播到我的默认页面Authorization,并且我能够获得200 OK包含有效数据的响应。

赏金更新

以下是重现此确切行为的步骤:

1.在 ASP.NET 中创建一个“新网站”,随意命名为“InsecureWebsite”

2.编辑web.config以拒绝所有未经身份验证的用户:

<authentication mode="Windows" />
  <authorization>
    <deny users="?"/>
  <allow users="*"/>
</authorization>

3.将网站发布到 DEV 服务器上的任意目录,并为应用程序创建一个虚拟目录

4.确保应用程序已启用脚本访问 (.ASP) 和集成 Windows 身份验证

5.打开Fiddler抓取流量

6.在您喜欢的浏览器中加载页面并查看Fiddler中的“Inspectors”选项卡,您将看到类似于以下内容的请求:

获取/不安全网站/ HTTP/1.1
主机:dev.subdomain.example.com
用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)
接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
接受语言:en-us,en;q=0.5
接受编码:gzip,deflate
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7
保活:300
连接:保持活动
授权:NTLM
{Base64 编码的认证数据}

初始请求Default.aspx将返回 a 401 Unauthorized,将进行协商,然后最终返回 a 200 OK

然后,在 Fiddler 中,我可以Authorization直接从重播的请求中删除标头,Default.aspx并且仍然获得200 OK. 这怎么可能?

解决方案

事实证明,Fiddler 在发出请求时使用相同的底层连接,因此一旦连接通过身份验证,同一连接上的任何请求也将被验证为与初始请求相同的用户。您可以在此处在 Fiddler 中关闭此功能:

Fiddler 选项截图 http://john.cognitivedelay.com/images/fiddler-options.gif

一旦取消选中,来自 Fiddler 的任何重放请求都将返回 a401 Unauthorized我所期望的。

感谢所有提供时间回复的人!

4

5 回答 5

2

编辑:每个更新的问题:

您是在 Fiddler 本身中进行回放,还是直接连接到网络服务器?可能是 Fiddler 正在重用现有的 HTTP 连接(它可以作为代理)......我认为 IWA 可能会将整个连接标记为已验证,而不仅仅是当前请求,这意味着未来的任何请求都在同一连接重用第一次协商的授权和身份验证...

原答案:试试

[WebMethod(EnableSession=true)]  
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)]

看看这是否有帮助?

(可能[PrincipalPermission(SecurityAction.Demand, Role="myDevRole")]如果这更适合你......)

于 2009-07-15T06:16:47.313 回答
2

Ajax 调用是在现有已验证会话的新线程上完成的,这就是您在标头中看不到任何验证信息的原因。会话已通过身份验证。

您可以通过引用 System.Threading.Thread.CurrentPrincipal.Identity.Name 获取经过身份验证的用户的身份,然后将其传递给任何角色管理例程:

[WebMethod(EnableSession = true)]   
public static string WhoAmI()
{
    // Return the identity of the authenticated windows user.
    Return System.Threading.Thread.CurrentPrincipal.Identity.Name;
 }
于 2009-07-16T15:56:05.817 回答
1

在本地开发机器上使用 Windows 身份验证,每个请求都将来自经过身份验证的用户。所以,拒绝用户=“?” 永远不会在本地拒绝任何请求。

如果您在远程 IIS 计算机上点击此操作,您未通过身份验证或将使用表单身份验证,则在您成功请求 Default.aspx 或页面方法之前需要进行身份验证。

于 2009-07-16T16:36:27.357 回答
1

将此属性添加到 web 方法 [PrincipalPermissionAttribute( SecurityAction.Demand, Role = "myDevRole" )]

然后在 Global.asax 事件 Application_AuthenticateRequest 上,您可以确保当前线程用户已正确验证 - 即采取必要措施避免欺诈 cookie 或会话。

于 2009-07-13T15:04:43.517 回答
1

您可以潜在地将身份验证信息添加到消息的标题中,然后在 web 方法中对自己进行身份验证。

或者你可以试试这样这样

于 2009-06-17T18:50:37.817 回答