5

この質問をした後、私はNegotiateStreamを使用してJavaサーバーに対してWindowsクライアントを認証しようとしています。Javaは優れたNTLMライブラリをサポートしていないようです。そのため、Javaが(GSS-APIを介して)はるかに優れていると思われるKerberosを使用する必要があると想定して取り組んできました。

問題は、NegotiateStreamが毎回NTLMを使用しようとしているように見えることです。ドキュメントは、どちらも使用できることを示唆していますが、選択方法は指定されていません。選択するメカニズムを制御するためのAPIのオプションが表示されません。方法はありますか?

私は自分自身にサービスプリンシパル名を持っており、私のクライアントコードは次のようになっています。

string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true);
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn);

サーバー側では、最初に受信したバイトのセットは22,1,0,0,59で、次に「NTLMSSP」です。これは私が予期していなかったことです。

SPN文字列に対していくつかの異なる形式を試しましたが、正しい形式が何であるかわかりません。私はもともとSPNを作成しました

setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>

setspn -Lは、次のように正常にリストします。

TEST/<my-pc-name>.<domain-name>

私は何か間違ったことをしているのですか、それともこのことを完全に誤解していますか?:)

4

1 に答える 1

5

SPN名の完全な構文は<service>/<user>@DOMAIN;です。どうやら、ドメイン名を省略できるようです。ただし、ユーザー名がである場合は、それ以上短縮しないでください。リストされているmy-pc-name.domain-nameとおりにSPNを指定してください。spn -L

于 2009-09-30T19:56:37.167 に答える