问题标签 [ihttpmodule]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 为什么无法将 HttpApplication 事件处理程序解除绑定到 IHttpModule 初始化范围之外
假设我们只想在 Web 应用程序启动后和 Web 请求期间执行某个操作一次或几次。
将抛出以下异常:
事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件。
asp.net - 对于 IIS 收到的每个请求,是否多次调用 ReleaseRequestState?
我正在 VS2010/ASP.NET 4.0 中编写一个用于 IIS 7 的 HttpModule。该模块将通过加密查询字符串来强制执行查询字符串的安全性。
我希望这个模块完全独立于网站并对网站透明,以便网站不知道正在使用查询字符串加密的事实。这将首先确保页面/控件不必关心这个问题。其次,它将为生产环境启用查询字符串加密,并为非生产环境禁用它(通过从 Web.config 中删除 HTTP 模块)。
我将 HttpModule 设计为通过 Web.config 通过以下方式插入 IIS:
模块本身如下所示:
有一个类 QueryStringSecurityStream 用于处理响应中的 HTML 输出,并通过将其中的查询字符串替换为加密的字符串来保护所有标签。
魔术发生或应该发生在 ReplaceHRefsWithSecureHRefs() 扩展方法中。
此方法需要整个HTML。它将使用细齿梳(即使用正则表达式)进行检查,找到所有锚标记,取出它们的 href 属性,将 href 值中的任何查询字符串替换为加密版本并返回 HTML。然后,此 HTML 将被写入响应流。
到目前为止,一切都很好。所有这一切都失败了,因为我怀疑 ReleaseRequestState 会针对单个请求多次引发。也就是说,对于一次 BeginRequest 的调用,会导致多次调用 ReleaseRequestState。
我正在寻找的是:
确认我的预感是正确的。我问过 Google 先生和 MSDN 先生,但没有找到任何确定的答案。我似乎记得在从 IIS 6 中运行的 ASMX Web 服务调试 WSDL 时遇到了类似的问题。在这种情况下,我通过缓存传入的字节流直到我拥有有效的 XML 并在修改后将其全部写出来解决了这个问题。
处理这种情况的正确方法。您可以将此具体表示单个 BeginRequest/多个 ReleaseRequestState 调用问题或查询字符串加密。
女士们先生们。启动你的引擎。让答案滚滚而来。
更新:
通过创建一个缓冲区来存储对 ReleaseRequestState 的多次调用的响应内容,我已经为自己解决了这个问题。在每次调用时,我都会检查标签是否存在,</html>
并在修改后写出缓冲到该点的内容(在我的情况下,加密<a>
标签中的查询字符串)。
所以:
- 将 StringBuilder 声明为 QueryStringSecurityModule 类中的私有字段成员(在我的例子中, StringBuilder 用作响应内容的缓冲区)。
- 在 BeginRequest 处初始化字段(在我的例子中,分配一个 StringBuilder)。
- 最终确定 EndRequest 的字段(在我的情况下将其设置为 null,尽管我已经读过 EndRequest 并不总是触发)
- 缓冲区字节被发送到自定义过滤器中的写入,直到我们找到一个关闭的 html 标记,此时我们修改缓冲区内容并将它们写入输出流。
有人想评论这种方法吗?
c# - NTLM 身份验证。无法让它在 IHttpModule 中工作。AcceptSecurityContext 总是失败
这是设置。在 ASP.Net 站点上,我们希望在特定页面上进行 NTLM 身份验证。这样做的方式是有一个模块只响应这些页面,然后执行 NTLM 身份验证所需的来回请求/响应。
NTLM 并不是那么容易,所以经过一番挖掘,我发现 Cassini 实际上内置了这个功能:
http://cassinidev.codeplex.com/SourceControl/changeset/view/70631#1365123
这是相关的方法:
以下是 Cassini 使用该代码的方式:
http://cassinidev.codeplex.com/SourceControl/changeset/view/70631#1365119
这是基本的工作流程。第一次,它只是将“WWW-Authenticate: NTLM”添加到标题中。客户端响应 NTLM: some token string。此时,Cassini 获取此字符串,并使用它来调用底层的 AcceptSecurityContext WinAPI 调用。这会生成另一个令牌字符串,然后将其发送回客户端。然后客户端发回另一个加密的令牌字符串,然后 Cassini 再次将其传递给 AcceptSecurityContext 方法。此时在 Cassini 应用程序中,身份验证成功,我们都很好。
我曾尝试在我的模块中重现此内容,但由于某种原因,在最后一次握手时,我无法进行身份验证:
每次调用它时,我都会收到以下响应:“SEC_E_INVALID_TOKEN”,根据文档,这意味着:“函数失败。传递给函数的令牌无效。”。我的测试站点在 IIS 中运行,此时此模块针对所有请求运行。我在标头中设置了 Keep-Alive(NTLM 在最后两个响应/请求期间需要相同的连接)。
我尝试过的其他事情:使用 Fiddler,我查看了从 Cassini 发回的标头,并尝试让我的模块发回相同的标头。没运气。我尝试更改站点运行的用户,但这也无济于事。
基本上,我的问题是,为什么它一直失败?为什么 Cassini 可以成功验证,而我的网站却不能?
asp.net - 在 PreRequestHandlerExecute 中,确定 .asmx 文件中的类名称
最终,我试图在处理请求之前获取对将处理请求的 webmethod 的引用,以检查其自定义属性。
目前,我通过将请求路径附加到项目命名空间、删除 .asmx 扩展名并用点替换斜杠来使其工作。但是,这假定类命名空间层次结构与请求路径层次结构相匹配,并且没有理由这样做。
缺少打开文件并对其进行解析 - 有没有一种方法可以给定 asmx 文件的请求路径,我可以检索对其中的类类型或类类型名称的引用?
对.NET 来说很新,所以我正在做的事情可能很愚蠢。但无论哪种方式,我都会对答案感兴趣:)
编辑:这不是我的项目,它被锁定在使用 ASP.NET 3.5 和 asmx webservices
编辑:目的是能够防止未经身份验证的用户执行某些 Web 服务,而无需向每个 Web 方法添加身份验证代码。我的想法是在 webmethods 上使用自定义属性将它们标记为公共,并且只有那些将被自定义 HTTP 模块或处理程序允许由未经身份验证的用户执行。用户的类型存储在会话中。
c# - IHttpModule Response.Filter 写入不关闭 HTML
我编写了一个自定义 IHttpModule,但是当源中没有结束标记时它会导致问题。我在 CMS 中遇到了几个页面,我正在运行它,因为 .aspx 页面更像是一个处理程序,并且放弃关闭 html 以通过 ajax 将响应返回给用户。
这是我的来源:
如您所见,这很棒,因为它只在最后一次调用 Write 时进行替换,但如果输出没有结束 HTML 标记,则 blammo。
如果找不到关闭的 html,我最好的选择是甚至不添加新过滤器。但我不认为我可以这么早截取完整的流。除了寻找结束的html标签之外,还有另一种检测Write的方法是在流的末尾吗?
提前致谢。
.net - C# .net 中的 URL 重写
我如何重写一个 url,以便它在地址栏中显示类似 subdomain.example.com/blog 的路径,但显示一个类似 www.example.com/blog/?tag=/subdomain 的页面。
这是我想要发生的事件的过程:
第一个:我导航到 subdomain.example.com/blog 第二个:我被重定向到 www.example.com/blog/?tag=/subdomain 第三个:地址栏中的 url 仍然显示 subdomain.example.com/blog 即使我在 www.example.com/blog/?tag=/subdomain 页面。
我更喜欢使用 HttpContext.RewritePath() 方法
我一直试图在 IHttpModule 中对此进行编码但没有成功
这是我的代码:
asp.net-mvc-2 - ASP.NET MVC 从 URL 中提取控制器、操作和值
我正在编写一个 httpModule 来拦截到达 ASP.NET MVC 应用程序的请求。有没有一种简单的方法来确定 URL 的哪一部分构成区域、控制器、操作和实际值。
例如 www.mysite.com/category/products/GetDetails/101
类别:区域产品:控制器GetDetails:动作101:productId
有没有一种简单的方法可以从 RouteEngine 或其他东西中返回...
asp.net-mvc - 对静态文件的请求正在访问 ASP.NET MVC3 中的托管代码
创建自定义 IHttpModules,我意识到对静态文件(例如:.css 和 .js 文件)的请求正在命中托管模块。可能图片也有同样的问题。对于文件系统中存在的文件,IIS 不应该绕过 ASP.NET 吗?
例如:
我这样声明:
但是,即使使用前提条件,我也可以看到静态文件如何通过模块:
我试图忽略静态文件的规则,但这并没有什么不同:
这是平常的吗?或者我在这里错过了什么?据我所知,如果静态文件请求应该由 IIS 回答。如果我的托管模块被命中,则意味着 CLR ThreadPool 线程正在处理该请求,对吗?
问候。
更新:
我已禁用“runAllManagedModulesForAllRequests”:
一切似乎都很好,但我发现这篇文章:http ://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html 建议删除并阅读“UrlRoutingModule-4.0 " 具有空前提条件的模块。
在我的机器上,该模块的添加位于根 web.config 中,并且它已经有一个空的前置条件:
所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么默认情况下它是“真实的”?
问候。
asp.net - 阻止非用户访问静态资源
我正在努力将静态 PDF 文件的访问权限限制为仅登录用户。我只想在没有正确凭据的请求到来时使用来自资源的服务器端重定向。
我可以使用IHttpHandler
并设置path
值,但我不想手动提供文件。我希望登录用户的请求直接通过,更像是一个IHttpModule
,除了我无法设置路径来限制模块将执行的文件。
有没有办法通过处理程序传递请求,或限制模块的路径?
编辑
还需要注意的是,如果登录成功,我想使用特定的查询字符串参数将用户重定向到登录页面,将用户重定向回资源。
c# - 在 http 模块中识别发件人
我正在开发一个页面跟踪器应用程序,我需要登录时间、注销时间、会话 ID、登录用户和用户访问的每个页面、在该页面上花费的时间以及在控件被触发时触发的页面中的事件列表点击、选中或选中。我不想使用谷歌分析
现在,我通过在 http 模块中编写会话启动等来访问所有详细信息,一切都已实现。我将所有数据存储在哈希表中,并在单击注销或会话时间结束时将它们放入数据库。我对如何确定是否按下了注销按钮。
我可以直接编写用于在单击注销按钮本身时插入统计信息的代码,但我不想这样做,因为我想在 http 模块中捕获注销按钮 id 或文本,然后在 http module.i 中编写逻辑试图捕获发件人,但它通过引用 asax 引用而不是按钮引用来引发错误
我怎样才能实现这一点(跟踪在页面上单击了哪个按钮并在 http 模块中获取 id,因为 http 模块会为每个回发或加载触发)?