2

Cassini-dev の NTLM 認証クラスのこのコード ブロックでは、( Interopを介して) SECUR32.DLL への呼び出しが行われ、HTTP 要求のAuthorizationヘッダー内の base64 でエンコードされたデータが認証されます。AcceptSecurityContext()QuerySecurityContextToken( )の両方が を返す0場合、クライアントは承認されています。最後に、セキュリティ コンテキスト トークンから がSecurityIdentifier抽出されます ( _sid変数)。(一般的なセキュリティ IDについて少し)

NtlmAuth クラスの関連セクションは次のとおりです。

int num = Interop.AcceptSecurityContext(ref _credentialsHandle, zero,
                     ref _inputBufferDesc, 20,
                     0, ref _securityContext, ref _outputBufferDesc,
                     ref _securityContextAttributes, ref _timestamp);
if (num == 0x90312)
{
    securityContextAcquired = true;
    _blob = Convert.ToBase64String(inArray, 0, (int) _outputBuffer.cbBuffer);
}
else
{
    if (num != 0)
    {
        return false;
    }
    IntPtr phToken = IntPtr.Zero;
    if (Interop.QuerySecurityContextToken(ref _securityContext, ref phToken) != 0)
    {
         return false;
    }
    try
    {
         using (WindowsIdentity identity = new WindowsIdentity(phToken))
    {
         _sid = identity.User;
    }
}
finally
{
    Interop.CloseHandle(phToken);
}
_completed = true;

Request Classでは、NtlmAuthTryNtlmAuthenticate()が使用されているメソッドで、NTLM 認証の 3 つのステップを正常に完了した後、最終的な403を返すか要求を満たす前に、1 つの最終チェックが行われています。

if (_host.GetProcessSid() != auth.SID)
{
    _connection.WriteErrorAndClose(0x193);
    return false;
}

ここで、_host.GetProcessSid()SecurityIndentifierCassini プロセスの所有者 (私) のものであり、auth.SIDSecurityIdentifier認証されたユーザーのものです (上記のNtlmAuthクラスの _sid )。これら 2 つの SID が同じでない場合、403 が返されて認証が停止します。それ以外の場合、要求はブラウザーに提供されます。


私の質問は次のとおりです。

  1. 2 人の異なるユーザーの SecurityIndentifier を比較する必要があるのはなぜですか? Cassini プロセスを所有するユーザーではないユーザー/パスワードで NTLM 認証を試みると、これは失敗します (403 を返します) 。
  2. これが本当に意図された動作である場合、Cassini が Windows サービスとして実行される場合、ホスト SID がS-1-5-18 (または、OS のバージョンによっては同様のもの) になるため、誰もログインできなくなります。誰もオペレーティング システムとしてログインできません。これは Cassini の NTLM 認証実装の一部にすぎませんか? Cassini を正しく使用していませんか?
  3. これが明らかに意図した動作ではない場合、SecurityIndentifiers はこのコンテキストでどのような役割を果たしますか? 特定のクラス/グループのクライアント SID を受け入れるために、ホスト SID が特定のクラスまたはグループである必要があることを確認するために、追加のチェックを行う必要がありますか? ホスト/クライアント SID を処理する場合、OS バージョン (XP/Vista/7) の影響はありますか?
  4. それとも、SecurityIdentifiers は保存も受け渡しもされておらず、ユーザー/クライアントをさらに識別するために使用されていないため、ここでは SecurityIdentifiers の適切な使用法はありませんか?

更新: cassinidev フォーラムの誰かが 2010 年にこの SID チェックを削除するパッチ(パッチ #6604) を提案したようですが、まだ評価中です。

4

1 に答える 1

1

答えではありませんが、同様の問題に気づいていますが、症状が少し異なります。Windowsサービスでホストされ、Cassini-devがWindows認証を使用するように構成されている場合、HttpContext.Current.Userはサービスが実行されているアカウントです。リクエストを行ったユーザーではなく、下にあります。

これは私にはcassini-devのバグのようです。

于 2011-12-01T18:40:48.347 に答える