Skip to content

Commit 77db6ea

Browse files
markbenvenutorstam
authored andcommitted
CSHARP-2366: GSSAPI Scram Authentication starts scram conversation wrong
1 parent ce8471c commit 77db6ea

File tree

4 files changed

+38
-27
lines changed

4 files changed

+38
-27
lines changed

src/MongoDB.Driver.Core/Core/Authentication/GssapiAuthenticator.cs

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public string Name
196196
get { return MechanismName; }
197197
}
198198

199-
public ISaslStep Initialize(IConnection connection, ConnectionDescription description)
199+
public ISaslStep Initialize(IConnection connection, SaslConversation conversation, ConnectionDescription description)
200200
{
201201
Ensure.IsNotNull(connection, nameof(connection));
202202
Ensure.IsNotNull(description, nameof(description));
@@ -229,17 +229,19 @@ public ISaslStep Initialize(IConnection connection, ConnectionDescription descri
229229
}
230230
}
231231

232-
return new FirstStep(_serviceName, hostName, _realm, _username, _password);
232+
return new FirstStep(_serviceName, hostName, _realm, _username, _password, conversation);
233233
}
234234
}
235235

236236
private class FirstStep : ISaslStep
237237
{
238238
private readonly string _authorizationId;
239+
private byte[] _bytesToSendToServer;
240+
private readonly Sspi.SecurityContext _context;
239241
private readonly SecureString _password;
240242
private readonly string _servicePrincipalName;
241243

242-
public FirstStep(string serviceName, string hostName, string realm, string username, SecureString password)
244+
public FirstStep(string serviceName, string hostName, string realm, string username, SecureString password, SaslConversation conversation)
243245
{
244246
_authorizationId = username;
245247
_password = password;
@@ -248,20 +250,7 @@ public FirstStep(string serviceName, string hostName, string realm, string usern
248250
{
249251
_servicePrincipalName += "@" + realm;
250252
}
251-
}
252-
253-
public byte[] BytesToSendToServer
254-
{
255-
get { return new byte[0]; }
256-
}
257-
258-
public bool IsComplete
259-
{
260-
get { return false; }
261-
}
262253

263-
public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer)
264-
{
265254
SecurityCredential securityCredential;
266255
try
267256
{
@@ -273,11 +262,9 @@ public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedF
273262
throw new MongoAuthenticationException(conversation.ConnectionId, "Unable to acquire security credential.", ex);
274263
}
275264

276-
byte[] bytesToSendToServer;
277-
Sspi.SecurityContext context;
278265
try
279266
{
280-
context = Sspi.SecurityContext.Initialize(securityCredential, _servicePrincipalName, bytesReceivedFromServer, out bytesToSendToServer);
267+
_context = Sspi.SecurityContext.Initialize(securityCredential, _servicePrincipalName, null, out _bytesToSendToServer);
281268
}
282269
catch (Win32Exception ex)
283270
{
@@ -290,13 +277,36 @@ public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedF
290277
throw new MongoAuthenticationException(conversation.ConnectionId, "Unable to initialize security context.", ex);
291278
}
292279
}
280+
}
281+
282+
public byte[] BytesToSendToServer
283+
{
284+
get { return _bytesToSendToServer; }
285+
}
286+
287+
public bool IsComplete
288+
{
289+
get { return false; }
290+
}
291+
292+
public ISaslStep Transition(SaslConversation conversation, byte[] bytesReceivedFromServer)
293+
{
294+
byte[] bytesToSendToServer;
295+
try
296+
{
297+
_context.Initialize(_servicePrincipalName, bytesReceivedFromServer, out bytesToSendToServer);
298+
}
299+
catch (Win32Exception ex)
300+
{
301+
throw new MongoAuthenticationException(conversation.ConnectionId, "Unable to initialize security context", ex);
302+
}
293303

294-
if (!context.IsInitialized)
304+
if (!_context.IsInitialized)
295305
{
296-
return new InitializeStep(_servicePrincipalName, _authorizationId, context, bytesToSendToServer);
306+
return new InitializeStep(_servicePrincipalName, _authorizationId, _context, bytesToSendToServer);
297307
}
298308

299-
return new NegotiateStep(_authorizationId, context, bytesToSendToServer);
309+
return new NegotiateStep(_authorizationId, _context, bytesToSendToServer);
300310
}
301311
}
302312

src/MongoDB.Driver.Core/Core/Authentication/PlainAuthenticator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public string Name
7777
}
7878

7979
// methods
80-
public ISaslStep Initialize(IConnection connection, ConnectionDescription description)
80+
public ISaslStep Initialize(IConnection connection, SaslConversation conversation, ConnectionDescription description)
8181
{
8282
Ensure.IsNotNull(connection, nameof(connection));
8383
Ensure.IsNotNull(description, nameof(description));

src/MongoDB.Driver.Core/Core/Authentication/SaslAuthenticator.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void Authenticate(IConnection connection, ConnectionDescription descripti
6767

6868
using (var conversation = new SaslConversation(description.ConnectionId))
6969
{
70-
var currentStep = _mechanism.Initialize(connection, description);
70+
var currentStep = _mechanism.Initialize( connection, conversation, description);
7171

7272
var command = CreateStartCommand(currentStep);
7373
while (true)
@@ -102,7 +102,7 @@ public async Task AuthenticateAsync(IConnection connection, ConnectionDescriptio
102102

103103
using (var conversation = new SaslConversation(description.ConnectionId))
104104
{
105-
var currentStep = _mechanism.Initialize(connection, description);
105+
var currentStep = _mechanism.Initialize(connection, conversation, description);
106106

107107
var command = CreateStartCommand(currentStep);
108108
while (true)
@@ -281,9 +281,10 @@ protected interface ISaslMechanism
281281
/// Initializes the mechanism.
282282
/// </summary>
283283
/// <param name="connection">The connection.</param>
284+
/// <param name="conversation">The SASL conversation.</param>
284285
/// <param name="description">The connection description.</param>
285286
/// <returns>The initial SASL step.</returns>
286-
ISaslStep Initialize(IConnection connection, ConnectionDescription description);
287+
ISaslStep Initialize(IConnection connection, SaslConversation conversation, ConnectionDescription description);
287288
}
288289

289290
/// <summary>

src/MongoDB.Driver.Core/Core/Authentication/ScramShaAuthenticator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public ScramShaMechanism(
131131

132132
public string Name => _name;
133133

134-
public ISaslStep Initialize(IConnection connection, ConnectionDescription description)
134+
public ISaslStep Initialize(IConnection connection, SaslConversation conversation, ConnectionDescription description)
135135
{
136136
Ensure.IsNotNull(connection, nameof(connection));
137137
Ensure.IsNotNull(description, nameof(description));

0 commit comments

Comments
 (0)