如何从".aspx"页面传递Windows身份验证至".ashx"处理程序

4
我有一个页面"Download.aspx",需要Windows身份验证。当用户登录后,他们会看到一个文件下载链接列表。这些链接实际上指向一个 "ZipHandler.ashx" 处理程序,该处理程序根据传递的参数处理请求。
我的问题是,当已验证的用户访问该处理程序时,IHttpHandler 中的 ProcessRequest 方法中的 HttpContext.Current.User.Identity.IsAuthenticatedfalse
我需要在 IHttpHandler 中检查他们是否经过身份验证,因为未经身份验证的用户也可以使用不同的结果访问处理程序。我已经在 "Download.aspx" 页面中测试了 HttpContext.Current.User.Identity.IsAuthenticated 的值,该值为 true,所以我不明白为什么 ashx 处理程序不是这种情况。我尝试将 IReadOnlySessionState 和 IRequiresSessionState 接口添加到我的处理程序中,但仍然存在相同的问题。

类似的问题在这个问题中讨论过。 - th1rdey3
1个回答

2
问题是,.ashx处理程序允许匿名访问,但如果处理程序允许匿名访问,Windows身份验证甚至不会传递 WindowsIdentity 。我所做的解决方法是,在web.config中创建两个处理程序条目,它们都指向同一个处理程序类:
<add name="AnonymousHandler" verb="GET" path="*/AnonymousHandler.ashx"
     type="MyLibrary.MyHandler, MyHandler, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=12e530ccad45314d"/>

<add name="AuthenticatedHandler" verb="GET" path="*/AuthenticatedHandler.ashx" 
     type="MyLibrary.MyHandler, MyHandler, Version=1.0.0.0, Culture=neutral,
     PublicKeyToken=12e530ccad45314d"/>

然后我拒绝了未经身份验证的访问认证版本:

<location path="AuthenticatedHandler.ashx">
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接