この質問により、noidentity
が指定された場合のデフォルトの動作は ですhost/myhostname
。
しかし、これは完全に真実ではないようです。
ID を指定しないと機能しない SOAP WCF サービス (Dynamics NAV Web サービスですが、質問は完全にクライアントの視点に関するものであるため、これは次の場合は問題になりません) があります。
サーバーは実際にはドメイン ユーザー アカウントで実行されています。
host/myhostname
が指定されていますが、このユーザー アカウントではなく、マシン アカウントに対してのみ指定されています。
http/myhostname
がこのドメイン ユーザー アカウントに指定されています。
3 つのシナリオを見てみましょう。
ID が指定されていません
EndpointAddress
次のコードで作成します。
new EndpointAddress(new Uri(endpoint))
このシナリオでは、次のことが起こっています。
- ヘッダーなしの HTTP POST
Authorization
。 - で応答し
WWW-Authenticate: Negotiate
ます。 - ヘッダー付きの HTTP POST
Authorization: Negotiate XXX
。XXX
で始まる 1584 の BASE64 エンコード バイト96 130 6
です。その中に読み取り可能なASCIIが見つかりません。 Authorization: Negotiate XXX
ヘッダー付きの応答。XXX
126 BASE64 でエンコードされたバイトです。その中に読み取り可能なASCIIが見つかりません。- ヘッダー付きの HTTP POST
Authorization: Negotiate XXX
。XXX
1527 BASE64 でエンコードされたバイトです。その中に読み取り可能なASCIIが見つかりません。 WWW-Authenticate: Negotiate XXX
ヘッダー付きの応答。XXX
113 BASE64 でエンコードされたバイトです。その中に読み取り可能なASCIIが見つかりません。- この時点で、クライアントは例外をスローします。内部例外メッセージは
The target principal name is incorrect
.
ID を手動でhost/myhostname
または間違った文字列に設定します。
次のコードで EndpointAddress を作成します。
var identity = EndpointIdentity.CreateSpnIdentity(@"host/myhostname");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
がデフォルト設定である場合host/myhostname
、上記のコードはこのデフォルト設定を明示的に指定するだけです。したがって、同じ動作が期待されます。しかし、これは機能します。NTLMにフォールバックしているようです。だから違いがあるに違いない。
これが起こっていることです:
- ヘッダーなしの HTTP POST
Authorization
。 - で応答し
WWW-Authenticate: Negotiate
ます。 Authorization: Negotiate XXX
XXX が 40 BASE64 でエンコードされたバイトであるHTTP POST 。最初のバイトは ASCII 文字NTLMSSP
です。WWW-Authenticate: Negotiate XXX
XXX が 270 BASE64 でエンコードされたバイトである場合の応答。最初のバイトは ASCII 文字NTLMSSP
です。また、FQDN は ASCII としてエンコードされているようです。- を含む HTTP POST。XXX は
Authorization: Negotiate XXX
、BASE64 でエンコードされた 590 バイトです。今回はASCII文字はありません。 - ペイロードでの応答。
興味深い事実: ID を間違った文字列に指定すると、まったく同じ動作になります。たとえば、次のEndpointAddress
コードで を指定すると、次のようになります。
var identity = EndpointIdentity.CreateSpnIdentity(@"thisIsTotallyWrongLoremIpsum");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
NTLM へのフォールバックでも上記の動作が得られます。
IDを正しく設定しましたhttp/myhostname
設定されている SPN を指定すると、 RFC 4559http/myhostname
により正しい選択と思われます。これは構成です:
var identity = EndpointIdentity.CreateSpnIdentity(@"http/myhostname");
var endpointAddress = new EndpointAddress(new Uri(endpoint), identity);
そして、これが起こっていることです:
- ヘッダーなしの HTTP POST
Authorization
。 - で応答し
WWW-Authenticate: Negotiate
ます。 - ヘッダー付きの HTTP POST
Authorization: Negotiate XXX
。XXX は 1580 BASE64 でエンコードされたバイトです。ASCI サインはありません。 - ペイロードでの応答。
この質問は、それを機能させるための熱意ではなく、理解に関するものです。私を混乱させているのは、最初の例と2番目の例の違いです。私の考えは次のとおりです。
- デフォルトの ID が の場合
host/myhostname
、 - に ID を手動で指定しても違いはありません
host/myhostname
。 - しかし、違いがあります
- したがって、これをデフォルトの ID にすることはできません。
だから私の質問は
- 実際のデフォルトの動作は何ですか。
http/myhostname
RFC4559 が原因で、デフォルトの SPN として選択されないのはなぜですか?
そして/または私は何か完全に間違っていることを理解しましたか?