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()はSecurityIndentifier
Cassini プロセスの所有者 (私) のものであり、auth.SIDはSecurityIdentifier
認証されたユーザーのものです (上記のNtlmAuthクラスの _sid )。これら 2 つの SID が同じでない場合、403 が返されて認証が停止します。それ以外の場合、要求はブラウザーに提供されます。
私の質問は次のとおりです。
- 2 人の異なるユーザーの SecurityIndentifier を比較する必要があるのはなぜですか? Cassini プロセスを所有するユーザーではないユーザー/パスワードで NTLM 認証を試みると、これは失敗します (403 を返します) 。
- これが本当に意図された動作である場合、Cassini が Windows サービスとして実行される場合、ホスト SID がS-1-5-18 (または、OS のバージョンによっては同様のもの) になるため、誰もログインできなくなります。誰もオペレーティング システムとしてログインできません。これは Cassini の NTLM 認証実装の一部にすぎませんか? Cassini を正しく使用していませんか?
- これが明らかに意図した動作ではない場合、SecurityIndentifiers はこのコンテキストでどのような役割を果たしますか? 特定のクラス/グループのクライアント SID を受け入れるために、ホスト SID が特定のクラスまたはグループである必要があることを確認するために、追加のチェックを行う必要がありますか? ホスト/クライアント SID を処理する場合、OS バージョン (XP/Vista/7) の影響はありますか?
- それとも、SecurityIdentifiers は保存も受け渡しもされておらず、ユーザー/クライアントをさらに識別するために使用されていないため、ここでは SecurityIdentifiers の適切な使用法はありませんか?
更新: cassinidev フォーラムの誰かが 2010 年にこの SID チェックを削除するパッチ(パッチ #6604) を提案したようですが、まだ評価中です。