2

ノート:

この質問は、以前の改訂から範囲が広がりました。誰でも簡単に再現できるように、問題を単純化するように努めました。

Fiddlerを使用Authorizationすると、HTTPリクエストからヘッダーを消去した後、デフォルトページに対して任意のリクエストを再生でき200 OK、有効なデータでの応答を取得できます。

バウンティアップデート

この正確な動作を再現する手順は次のとおりです。

1. ASP.NETで「新しいWebサイト」を作成し、「InsecureWebsite」という名前を付けてください。

2.編集web.configして、認証されていないすべてのユーザーを拒否します。

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

3. WebサイトをDEVサーバー上の任意のディレクトリに公開し、アプリケーションの仮想ディレクトリを作成します

4.アプリケーションでスクリプトアクセス(.ASP)と統合Windows認証が有効になっていることを確認します

5. Fiddlerを開いて、トラフィックをキャプチャします

6.お気に入りのブラウザにページをロードし、Fiddler内の[インスペクター]タブを確認すると、次のようなリクエストが表示されます。

GET / InsecureWebsite / 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
Accept-Language:en-us、en; q = 0.5
Accept-Encoding:gzip、deflate
Accept-Charset:ISO-8859-1、utf-8; q = 0.7、*; q = 0.7
キープアライブ:300
接続:キープアライブ
承認:NTLM
{Base64でエンコードされた認証データ}

への最初の要求は、Default.aspxを返し、401 Unauthorizedネゴシエーションに入り、最後にを返します200 OK

FiddlerではAuthorization、再生されたリクエストからヘッダーを直接消去しDefault.aspxても、を取得できます200 OK。そんなことがあるものか?

解決

Fiddlerはリクエストを行うときに同じ基本接続を使用することが判明したため、接続が認証されると、同じ接続上のすべてのリクエストも最初のリクエストと同じユーザーとして認証されます。ここでFiddlerでこの機能をオフにすることができます:

Fiddlerオプションのスクリーンショットhttp://john.cognitivedelay.com/images/fiddler-options.gif

これがチェックされていない場合、Fiddler内から再生されたリクエストは、401 Unauthorized期待どおりにを返します。

返信する時間を提供してくれたすべての人に感謝します!

4

5 に答える 5

2

編集:更新された質問ごと:

Fiddler自体でリプレイを行っていますか、それともWebサーバーに直接接続していますか?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を参照することにより、認証されたユーザーのIDを取得し、それを任意のロール管理ルーチンに渡すことができます。

[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

この属性をWebメソッドに追加します [PrincipalPermissionAttribute( SecurityAction.Demand, Role = "myDevRole" )]

次に、Global.asaxイベントApplication_AuthenticateRequestで、現在のスレッドユーザーが正しく認証されていることを確認できます。つまり、不正なCookieやセッションを回避するために必要なことを実行します。

于 2009-07-13T15:04:43.517 に答える
1

メッセージのヘッダーに認証情報を追加してから、webmethodで自分自身を認証する可能性があります。

またはあなたはこれ またはこれのような何かを試すことができます

于 2009-06-17T18:50:37.817 に答える
1

ローカル開発マシンでWindows認証を使用すると、すべての要求は認証されたユーザーから送信されます。したがって、users = "?"を拒否します ローカルでリクエストを拒否することはありません。

認証されていない、またはフォーム認証を使用する予定のリモートIISマシンでこれを実行した場合、Default.aspxまたはpageメソッドのいずれかを正常に要求する前に認証が必要になります。

于 2009-07-16T16:36:27.357 に答える