/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to be authenticated.</param> /// <returns>true if authenticated; otherwise false.</returns> /// <exception cref="ArgumentNullException"><paramref name="session"/> is null.</exception> /// <exception cref="SshAuthenticationException">No suitable authentication method found to complete authentication.</exception> public bool Authenticate(Session session) { var authenticated = AuthenticationResult.Failure; if (session == null) { throw new ArgumentNullException("session"); } session.RegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.RegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.RegisterMessage("SSH_MSG_USERAUTH_BANNER"); session.UserAuthenticationBannerReceived += Session_UserAuthenticationBannerReceived; // Try to authenticate against none var noneAuthenticationMethod = new NoneAuthenticationMethod(this.Username); authenticated = noneAuthenticationMethod.Authenticate(session); var allowedAuthentications = noneAuthenticationMethod.AllowedAuthentications; var triedAuthentications = new List <string>(); while (authenticated != AuthenticationResult.Success) { // Find first authentication method var method = this.AuthenticationMethods.Where((a) => allowedAuthentications.Contains(a.Name) && !triedAuthentications.Contains(a.Name)).FirstOrDefault(); if (method == null) { throw new SshAuthenticationException("No suitable authentication method found to complete authentication."); } triedAuthentications.Add(method.Name); authenticated = method.Authenticate(session); if (authenticated == AuthenticationResult.PartialSuccess) { // If further authentication is required then continue to try another method allowedAuthentications = method.AllowedAuthentications; continue; } // If authentication was successful or failure, exit break; } session.UserAuthenticationBannerReceived -= Session_UserAuthenticationBannerReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.UnRegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.UnRegisterMessage("SSH_MSG_USERAUTH_BANNER"); this.IsAuthenticated = authenticated == AuthenticationResult.Success; return(authenticated == AuthenticationResult.Success); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns>Result of authentication process.</returns> public override AuthenticationResult Authenticate(Session session) { _session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.UserAuthenticationInformationRequestReceived += Session_UserAuthenticationInformationRequestReceived; session.RegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); try { session.SendMessage(_requestMessage); session.WaitOnHandle(_authenticationCompleted); } finally { session.UnRegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.UserAuthenticationInformationRequestReceived -= Session_UserAuthenticationInformationRequestReceived; } if (_exception != null) { throw _exception; } return(_authenticationResult); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns></returns> public override AuthenticationResult Authenticate(Session session) { this._session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.SendMessage(this._requestMessage); session.WaitHandle(this._authenticationCompleted); session.UnRegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; if (this._exception != null) { throw this._exception; } return(this._authenticationResult); }
private void Session_MessageReceived(object sender, MessageEventArgs <Message> e) { if (e.Message is PasswordChangeRequiredMessage) { _session.UnRegisterMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"); ThreadAbstraction.ExecuteThread(() => { try { var eventArgs = new AuthenticationPasswordChangeEventArgs(Username); // Raise an event to allow user to supply a new password if (PasswordExpired != null) { PasswordExpired(this, eventArgs); } // Send new authentication request with new password _session.SendMessage(new RequestMessagePassword(ServiceName.Connection, Username, _password, eventArgs.NewPassword)); } catch (Exception exp) { _exception = exp; _authenticationCompleted.Set(); } }); } }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns>Result of authentication process.</returns> public override AuthenticationResult Authenticate(Session session) { this._session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.SendMessage(this._requestMessage); session.WaitOnHandle(this._authenticationCompleted); session.UnRegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; if (this._exception != null) { throw this._exception; } return this._authenticationResult; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns> /// Result of authentication process. /// </returns> /// <exception cref="ArgumentNullException"><paramref name="session" /> is <c>null</c>.</exception> public override AuthenticationResult Authenticate(Session session) { if (session == null) { throw new ArgumentNullException("session"); } _session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; try { session.RegisterMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"); session.SendMessage(_requestMessage); session.WaitOnHandle(_authenticationCompleted); } finally { session.UnRegisterMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; } if (_exception != null) { throw _exception; } return(_authenticationResult); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns>Result of authentication process.</returns> public override AuthenticationResult Authenticate(Session session) { _session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.UserAuthenticationInformationRequestReceived += Session_UserAuthenticationInformationRequestReceived; session.RegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); try { session.SendMessage(_requestMessage); session.WaitOnHandle(_authenticationCompleted); } finally { session.UnRegisterMessage("SSH_MSG_USERAUTH_INFO_REQUEST"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.UserAuthenticationInformationRequestReceived -= Session_UserAuthenticationInformationRequestReceived; } if (_exception != null) throw _exception; return _authenticationResult; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns> /// Result of authentication process. /// </returns> public override AuthenticationResult Authenticate(Session session) { session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var keyFile in this.KeyFiles) { this._authenticationCompleted.Reset(); this._isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, this.Username, keyFile.HostKey.Name, keyFile.HostKey.Data); if (this.KeyFiles.Count < 2) { // If only one key file provided then send signature for very first request var signatureData = new SignatureData(message, session.SessionId).GetBytes(); message.Signature = keyFile.HostKey.Sign(signatureData); } // Send public key authentication request session.SendMessage(message); session.WaitHandle(this._authenticationCompleted); if (this._isSignatureRequired) { this._authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, this.Username, keyFile.HostKey.Name, keyFile.HostKey.Data); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); signatureMessage.Signature = keyFile.HostKey.Sign(signatureData); // Send public key authentication request with signature session.SendMessage(signatureMessage); } session.WaitHandle(this._authenticationCompleted); if (this._authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return(this._authenticationResult); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to be authenticated.</param> /// <exception cref="ArgumentNullException"><paramref name="session"/> is null.</exception> /// <exception cref="SshAuthenticationException">No suitable authentication method found to complete authentication, or permission denied.</exception> public void Authenticate(Session session) { if (session == null) { throw new ArgumentNullException("session"); } session.RegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.RegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.RegisterMessage("SSH_MSG_USERAUTH_BANNER"); session.UserAuthenticationBannerReceived += Session_UserAuthenticationBannerReceived; try { // the exception to report an authentication failure with SshAuthenticationException authenticationException = null; // try to authenticate against none var noneAuthenticationMethod = new NoneAuthenticationMethod(this.Username); var authenticated = noneAuthenticationMethod.Authenticate(session); if (authenticated != AuthenticationResult.Success) { var failedAuthenticationMethods = new List <AuthenticationMethod>(); if (TryAuthenticate(session, noneAuthenticationMethod.AllowedAuthentications.ToList(), failedAuthenticationMethods, ref authenticationException)) { authenticated = AuthenticationResult.Success; } } this.IsAuthenticated = authenticated == AuthenticationResult.Success; if (!IsAuthenticated) { throw authenticationException; } } finally { session.UserAuthenticationBannerReceived -= Session_UserAuthenticationBannerReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.UnRegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.UnRegisterMessage("SSH_MSG_USERAUTH_BANNER"); } }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns></returns> public override AuthenticationResult Authenticate(Session session) { if (this.Protocol == null) { return(AuthenticationResult.Failure); } session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var identity in this.Protocol.GetIdentities()) { this._authenticationCompleted.Reset(); this._isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, this.Username, identity.Type, identity.Blob); // Send public key authentication request session.SendMessage(message); session.WaitOnHandle(this._authenticationCompleted); if (this._isSignatureRequired) { this._authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, this.Username, identity.Type, identity.Blob); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); signatureMessage.Signature = this.Protocol.SignData(identity, signatureData); // Send public key authentication request with signature session.SendMessage(signatureMessage); } session.WaitOnHandle(this._authenticationCompleted); if (this._authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return(this._authenticationResult); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns> /// Result of authentication process. /// </returns> /// <exception cref="ArgumentNullException"><paramref name="session" /> is <c>null</c>.</exception> public override AuthenticationResult Authenticate(Session session) { if (session == null) throw new ArgumentNullException("session"); _session = session; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.UserAuthenticationPasswordChangeRequiredReceived += Session_UserAuthenticationPasswordChangeRequiredReceived; try { session.RegisterMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"); session.SendMessage(_requestMessage); session.WaitOnHandle(_authenticationCompleted); } finally { session.UnRegisterMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"); session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.UserAuthenticationPasswordChangeRequiredReceived -= Session_UserAuthenticationPasswordChangeRequiredReceived; } if (_exception != null) throw _exception; return _authenticationResult; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to be authenticated.</param> /// <exception cref="ArgumentNullException"><paramref name="session"/> is null.</exception> /// <exception cref="SshAuthenticationException">No suitable authentication method found to complete authentication, or permission denied.</exception> public void Authenticate(Session session) { if (session == null) throw new ArgumentNullException("session"); session.RegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.RegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.RegisterMessage("SSH_MSG_USERAUTH_BANNER"); session.UserAuthenticationBannerReceived += Session_UserAuthenticationBannerReceived; try { // the exception to report an authentication failure with SshAuthenticationException authenticationException = null; // try to authenticate against none var noneAuthenticationMethod = new NoneAuthenticationMethod(this.Username); var authenticated = noneAuthenticationMethod.Authenticate(session); if (authenticated != AuthenticationResult.Success) { var failedAuthenticationMethods = new List<AuthenticationMethod>(); if (TryAuthenticate(session, noneAuthenticationMethod.AllowedAuthentications.ToList(), failedAuthenticationMethods, ref authenticationException)) { authenticated = AuthenticationResult.Success; } } this.IsAuthenticated = authenticated == AuthenticationResult.Success; if (!IsAuthenticated) throw authenticationException; } finally { session.UserAuthenticationBannerReceived -= Session_UserAuthenticationBannerReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.UnRegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.UnRegisterMessage("SSH_MSG_USERAUTH_BANNER"); } }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns></returns> public override AuthenticationResult Authenticate(Session session) { if (this.Protocol == null) return AuthenticationResult.Failure; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var identity in this.Protocol.GetIdentities()) { this._authenticationCompleted.Reset(); this._isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, this.Username, identity.Type, identity.Blob); // Send public key authentication request session.SendMessage(message); session.WaitOnHandle(this._authenticationCompleted); if (this._isSignatureRequired) { this._authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, this.Username, identity.Type, identity.Blob); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); signatureMessage.Signature = this.Protocol.SignData(identity, signatureData); // Send public key authentication request with signature session.SendMessage(signatureMessage); } session.WaitOnHandle(this._authenticationCompleted); if (this._authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return this._authenticationResult; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns> /// Result of authentication process. /// </returns> public override AuthenticationResult Authenticate(Session session) { session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var keyFile in KeyFiles) { _authenticationCompleted.Reset(); _isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, Username, keyFile.HostKey.Name, keyFile.HostKey.Data); if (KeyFiles.Count < 2) { // If only one key file provided then send signature for very first request var signatureData = new SignatureData(message, session.SessionId).GetBytes(); message.Signature = keyFile.HostKey.Sign(signatureData); } // Send public key authentication request session.SendMessage(message); session.WaitOnHandle(_authenticationCompleted); if (_isSignatureRequired) { _authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, Username, keyFile.HostKey.Name, keyFile.HostKey.Data); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); signatureMessage.Signature = keyFile.HostKey.Sign(signatureData); // Send public key authentication request with signature session.SendMessage(signatureMessage); } session.WaitOnHandle(_authenticationCompleted); if (_authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return _authenticationResult; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns></returns> public override AuthenticationResult Authenticate(Session session) { if (this.PrivateKeyAgent.Value == null) { return(AuthenticationResult.Failure); } session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var keyInfo in this.PrivateKeyAgent.Value.ListSsh2()) { var key = keyInfo.Key; this._authenticationCompleted.Reset(); this._isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, this.Username, key.Name, key.Data); // Send public key authentication request session.SendMessage(message); session.WaitHandle(this._authenticationCompleted); if (this._isSignatureRequired) { this._authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, this.Username, key.Name, key.Data); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); var signature = this.PrivateKeyAgent.Value.SignSsh2(key.Data, signatureData); if (signature != null) { signatureMessage.Signature = signature; // Send public key authentication request with signature session.SendMessage(signatureMessage); } else { this._authenticationResult = AuthenticationResult.Failure; this._authenticationCompleted.Set(); } } session.WaitHandle(this._authenticationCompleted); if (this._authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return(this._authenticationResult); }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to be authenticated.</param> /// <returns>true if authenticated; otherwise false.</returns> /// <exception cref="ArgumentNullException"><paramref name="session"/> is null.</exception> /// <exception cref="SshAuthenticationException">No suitable authentication method found to complete authentication.</exception> public bool Authenticate(Session session) { var authenticated = AuthenticationResult.Failure; if (session == null) throw new ArgumentNullException("session"); session.RegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.RegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.RegisterMessage("SSH_MSG_USERAUTH_BANNER"); session.UserAuthenticationBannerReceived += Session_UserAuthenticationBannerReceived; // Try to authenticate against none var noneAuthenticationMethod = new NoneAuthenticationMethod(this.Username); authenticated = noneAuthenticationMethod.Authenticate(session); var allowedAuthentications = noneAuthenticationMethod.AllowedAuthentications; var triedAuthentications = new List<string>(); while (authenticated != AuthenticationResult.Success) { // Find first authentication method var method = this.AuthenticationMethods.Where((a) => allowedAuthentications.Contains(a.Name) && !triedAuthentications.Contains(a.Name)).FirstOrDefault(); if (method == null) throw new SshAuthenticationException("No suitable authentication method found to complete authentication."); triedAuthentications.Add(method.Name); authenticated = method.Authenticate(session); if (authenticated == AuthenticationResult.PartialSuccess) { // If further authentication is required then continue to try another method allowedAuthentications = method.AllowedAuthentications; continue; } // If authentication was successful or failure, exit break; } session.UserAuthenticationBannerReceived -= Session_UserAuthenticationBannerReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_FAILURE"); session.UnRegisterMessage("SSH_MSG_USERAUTH_SUCCESS"); session.UnRegisterMessage("SSH_MSG_USERAUTH_BANNER"); this.IsAuthenticated = authenticated == AuthenticationResult.Success; return authenticated == AuthenticationResult.Success; }
/// <summary> /// Authenticates the specified session. /// </summary> /// <param name="session">The session to authenticate.</param> /// <returns></returns> public override AuthenticationResult Authenticate(Session session) { if (this.PrivateKeyAgent.Value == null) return AuthenticationResult.Failure; session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; session.MessageReceived += Session_MessageReceived; session.RegisterMessage("SSH_MSG_USERAUTH_PK_OK"); foreach (var keyInfo in this.PrivateKeyAgent.Value.ListSsh2()) { var key = keyInfo.Key; this._authenticationCompleted.Reset(); this._isSignatureRequired = false; var message = new RequestMessagePublicKey(ServiceName.Connection, this.Username, key.Name, key.Data); // Send public key authentication request session.SendMessage(message); session.WaitHandle(this._authenticationCompleted); if (this._isSignatureRequired) { this._authenticationCompleted.Reset(); var signatureMessage = new RequestMessagePublicKey(ServiceName.Connection, this.Username, key.Name, key.Data); var signatureData = new SignatureData(message, session.SessionId).GetBytes(); var signature = this.PrivateKeyAgent.Value.SignSsh2(key.Data, signatureData); if (signature != null) { signatureMessage.Signature = signature; // Send public key authentication request with signature session.SendMessage(signatureMessage); } else { this._authenticationResult = AuthenticationResult.Failure; this._authenticationCompleted.Set(); } } session.WaitHandle(this._authenticationCompleted); if (this._authenticationResult == AuthenticationResult.Success) { break; } } session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; session.MessageReceived -= Session_MessageReceived; session.UnRegisterMessage("SSH_MSG_USERAUTH_PK_OK"); return this._authenticationResult; }