問題タブ [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 リクエスト中に、あるアクションを 1 回または 2 回だけ実行したいとします。
次の例外がスローされます。
イベント ハンドラーは、IHttpModule の初期化中にのみ HttpApplication イベントにバインドできます。
asp.net - IISが受信したリクエストごとにReleaseRequestStateが複数回呼び出されますか?
IIS7で使用するためにVS2010/ASP.NET 4.0でHttpModuleを作成しています。このモジュールは、クエリ文字列を暗号化することでクエリ文字列のセキュリティを強化します。
このモジュールをWebサイトから完全に独立させ、透過的にして、クエリ文字列の暗号化が採用されていることをWebサイトが認識しないようにします。これにより、最初にページ/コントロールがこの問題を気にする必要がなくなります。次に、本番環境ではクエリ文字列の暗号化を有効にし、非本番環境では無効にします(Web.configからHTTPモジュールを削除することにより)。
次の方法で、Web.configを介してIISに接続するようにHttpModuleを設計しました。
モジュール自体は次のようになります。
応答のHTML出力をいじり、その中のクエリ文字列を暗号化されたものに置き換えることによってすべてのタグを保護するために使用されるクラスQueryStringSecurityStreamがあります。
この魔法は、ReplaceHRefsWithSecureHRefs()拡張メソッドで発生するか、発生するはずです。
このメソッドは、 HTML全体を想定しています。歯の細かい櫛で(つまり、正規表現を使用して)それを通過し、すべてのアンカータグを見つけ、それらのhref属性を取り出し、href値のクエリ文字列を暗号化されたバージョンに置き換えてHTMLを返します。このHTMLは、応答ストリームに書き出されます。
ここまでは順調ですね。個々のリクエストに対してReleaseRequestStateが複数回発生していると思われるため、これらすべてが失敗します。つまり、BeginRequestへの1回の呼び出しの結果として、ReleaseRequestStateへの複数の呼び出しがあります。
私が探しているのは:
私の勘が正しいことの確認。GoogleさんとMSDNさんに聞いてみましたが、決定的なものは見つかりませんでした。IIS6で実行されているASMXWebサービスからWSDLをデバッグしているときに、同様の問題が発生したことを覚えているようです。その場合、有効なXMLが得られるまで着信バイトストリームをキャッシュし、変更後にすべて書き出すことで問題を解決しました。
この種のシナリオを処理する正しい方法。これは、具体的には単一のBeginRequest /複数のReleaseRequestState呼び出しの問題、またはクエリ文字列の暗号化を一般的に意味するものと見なすことができます。
皆様。エンジンを始動します。答えを出しましょう。
アップデート:
リクエストのライフサイクルについてMSDNでこの記事を読みました
ReleaseRequestStateへの複数の呼び出しにわたって応答コンテンツを格納するためのバッファーを作成することにより、この問題を自分で解決しました。呼び出しのたびに、タグの存在を確認し、変更後(私の場合はタグ</html>
内のクエリ文字列を暗号化)、その時点までにバッファリングされたコンテンツを書き出します。<a>
それで:
- StringBuilderをQueryStringSecurityModuleクラスのプライベートフィールドメンバーとして宣言します(私の場合、応答コンテンツのバッファーとして機能するStringBuilder)。
- BeginRequestでフィールドを初期化します(私の場合、StringBuilderを割り当てます)。
- EndRequestでフィールドを完成させます(EndRequestが常に起動するとは限らないことを読みましたが、私の場合はnullに設定します)
- 終了htmlタグが見つかるまで、カスタムフィルターでWriteに送信されるバッファーバイト。その時点で、バッファーの内容を変更し、出力ストリームに書き込みます。
誰かがこのアプローチについてコメントしたいですか?
c# - NTLM認証。IHttpModuleで動作させることができません。AcceptSecurityContextは常に失敗します
これがセットアップです。ASP.Netサイトでは、特定のページでNTLM認証を使用する必要があります。これが機能する方法は、それらのページにのみ応答し、NTLM認証に必要な要求/応答を行ったり来たりするモジュールが存在することです。
NTLMはそれほど簡単ではないので、少し掘り下げてみると、カッシーニには実際にこの機能が組み込まれていることがわかりました。
http://cassinidev.codeplex.com/SourceControl/changeset/view/70631#1365123
関連する方法は次のとおりです。
カッシーニがそのコードを使用する方法は次のとおりです。
http://cassinidev.codeplex.com/SourceControl/changeset/view/70631#1365119
これが基本的なワークフローです。初めて、ヘッダーに「WWW-Authenticate:NTLM」を追加するだけです。クライアントはNTLMで応答します:いくつかのトークン文字列。この時点で、Cassiniはこの文字列を受け取り、それを使用して基になるAcceptSecurityContextWinAPI呼び出しを呼び出します。これにより、別のトークン文字列が生成され、クライアントに返送されます。次に、クライアントは別の暗号化されたトークン文字列を送り返し、CassiniはそれをAcceptSecurityContextメソッドに再度渡します。カッシーニアプリのこの時点で、認証は成功し、私たちは皆元気です。
モジュールでこれを再現しようとしましたが、何らかの理由で、最後のハンドシェイクで認証に失敗しました。
呼び出すたびに、「SEC_E_INVALID_TOKEN」という応答が返されます。これは、ドキュメントによると、 「関数が失敗しました。関数に渡されたトークンが無効です。」という意味です。私のテストサイトはIISで実行されており、このモジュールはこの時点ですべての要求に対して実行されます。ヘッダーにKeep-Aliveを設定しています(NTLMは、最後の2つの応答/要求中に同じ接続を必要とします)。
私が試した他のこと:Fiddlerを使用して、カッシーニから返送されているヘッダーを確認し、モジュールに同じヘッダーを返送させてみました。運がない。サイトを運営しているユーザーを変更しようとしましたが、それも役に立ちませんでした。
基本的に、私の質問は、なぜそれが失敗し続けるのかということです。カッシーニが正常に認証できるのに、私のWebサイトが認証できないのはなぜですか?
asp.net - PreRequestHandlerExecute 内で、.asmx ファイル内のクラスの名前を決定します
最終的に、カスタム属性をチェックするために、リクエストを処理する前に、リクエストを処理する webmethod への参照を取得しようとしています。
現在、リクエスト パスをプロジェクトの名前空間に追加し、.asmx 拡張子を削除し、スラッシュをドットに置き換えることで機能しています。ただし、これは、クラスの名前空間の階層がリクエスト パスの階層と一致していることを前提としており、そうすべき理由はありません。
ファイルを開いて解析する以外に、asmx ファイルへのリクエスト パスを指定して、内部のクラス タイプまたは内部のクラス タイプの名前への参照を取得する方法はありますか?
.NET はかなり新しいので、私がやっていることはばかげているかもしれません。しかし、いずれにせよ、私は答えに興味があります:)
編集: これは私のプロジェクトではなく、ASP.NET 3.5 および asmx Web サービスの使用にロックインされています
編集: 目的は、すべての webmethod に認証コードを追加することなく、特定の webservices が認証されていないユーザーによって実行されるのを防ぐことができるようにすることです。私のアイデアは、webmethods でそれらを public としてマークするカスタム属性を使用することでした。これらのみが、認証されていないユーザーによって実行されるカスタム HTTP モジュールまたはハンドラーによって許可されます。ユーザーのタイプはセッションに保存されます。
c# - IHttpModule Response.Filter Write with Close HTML
カスタム IHttpModule を作成しましたが、ソースに終了タグがない場合に問題が発生します。私はCMSでいくつかのページに出くわしました.aspxページがハンドラーのように使用され、htmlを閉じてajax経由でユーザーに応答を返す場所でこれを実行しています。
ここに私の情報源があります:
ご覧のとおり、これは Write が最後に呼び出されたときにのみ置換を行うため、優れていますが、出力に終了 HTML タグがない場合は blammo.
私の最善の選択肢は、閉じている html が見つからない場合は、新しいフィルターを追加することさえしないことです。でも、そんなに早い段階で完全なストリームを傍受できるとは思いません。書き込みがストリームの最後にあることを検出する別の方法があることに失敗した場合は、html の終了タグを探す以外に?
前もって感謝します。
.net - C# .net での URL 書き換え
アドレス バーに subdomain.example.com/blog のようなパスが表示され、www.example.com/blog/?tag=/subdomain などのページが表示されるように URL を書き換えるにはどうすればよいですか。
これが私が発生させたいイベントのプロセスです:
1 つ目: subdomain.example.com/blog に移動します 2 つ目: www.example.com/blog/?tag=/subdomain にリダイレクトされます 3 つ目: アドレス バーの URL にはまだ subdomain.example.com/blog が表示されます私は www.example.com/blog/?tag=/subdomain ページにいます。
HttpContext.RewritePath() メソッドを使用することをお勧めします
これを IHttpModule でコーディングしようとしましたが、成功しませんでした
ここに私のコードがあります:
asp.net-mvc-2 - ASP.NET MVCは、URLからコントローラー、アクション、および値を抽出します
ASP.NETMVCアプリケーションに送信される要求をインターセプトするhttpModuleを作成しています。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 にあり、すでに空の preCondition があります。
だから今、私は少し混乱しています.このパラメータのステータスは何ですか? 私はそれを使うべきですか、それともすべきではありませんか?デフォルトで「true」になるのはなぜですか?
よろしく。
asp.net - 非ユーザーによる静的リソースへのアクセスの停止
静的PDFファイルへのアクセスをログインユーザーのみに制限するように取り組んでいます。適切な資格情報を持たないリクエストが来た場合にのみ、リソースからのサーバー側リダイレクトを使用したいと思います。
を使用して値IHttpHandler
を設定することはできますpath
が、ファイルを手動で提供する必要はありません。IHttpModule
モジュールが動作するファイルを制限するパスを設定できないことを除いて、ログインしたユーザーからのリクエストを、のように直接通過させたいです。
ハンドラーを介してリクエストを渡す方法、またはモジュールのパスを制限する方法はありますか?
編集
ログインが成功した場合にユーザーをリソースにリダイレクトする特定のクエリ文字列パラメーターを使用して、ユーザーをログインページにリダイレクトすることにも注意してください。
c# - http モジュールで送信者を特定する
ログイン時間、ログアウト時間、セッションID、ログインユーザーとユーザーがアクセスした各ページ、そのページで費やされた時間、およびコントロールが発生したときに発生するページ内のイベントのリストが必要なページトラッカーアプリを開発していますクリック、チェック、または選択。Google アナリティクスは使いたくない
今のところ、httpモジュールでセッション開始などを書くことですべての詳細にアクセスしており、すべてが達成されています。すべてのデータをハッシュテーブルに保存し、ログアウトがクリックされたとき、またはセッション時間切れになったときにそれらをdbにスローしています。ログアウトボタンが押されたかどうかを識別します。
ログアウトボタン自体のクリックで統計を挿入するためのコードを直接書くことができますが、httpモジュールでログアウトボタンIDまたはテキストをキャプチャしてからロジックをhttpモジュールに書きたいので、そうしたくありません.i送信者をキャプチャしようとしましたが、ボタン参照ではなく asax 参照を参照してエラーをスローしています
どうすればこれを達成できますか(httpモジュールはポストバックまたはロードごとにトリガーされるため、ページでクリックされたボタンを追跡し、httpモジュールでIDを取得します)?