XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Existing AD Users Cannot Login to XOCE but New Users Can

    Scheduled Pinned Locked Moved Xen Orchestra
    19 Posts 3 Posters 3.5k Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • K Offline
      kagbasi-wgsdac @olivierlambert
      last edited by

      @olivierlambert

      As instructed, I deployed XOA, grabbed a trial license, and updated it to the latest version then tried again; same results. Getting the following error for my admin account (same one I use to log into every other workstation on the network😞

      Code: -32000
      Message: could not authenticate user
      {
        "message": "could not authenticate user",
        "name": "Error",
        "stack": "Error: could not authenticate user\n    at /usr/local/lib/node_modules/xo-server-auth-ldap/src/index.js:254:15\n    at default.testPlugin (file:///usr/local/lib/node_modules/xo-server/src/xo-mixins/plugins.mjs:280:5)\n    at Xo.test (file:///usr/local/lib/node_modules/xo-server/src/api/plugin.mjs:109:3)\n    at Api.#callApiMethod (file:///usr/local/lib/node_modules/xo-server/src/xo-mixins/api.mjs:417:20)"
      }
      

      If I then use one of the test accounts I had created AFTER I started noticing the failed attempts (i.e., after 05/15/2023), it works.

      Plugin test
      The test appears to be working.
      

      Prior to testing, I logged into the Domain Controller and verified that the service account I'm using to bind to AD was not locked. I'm willing to send whatever screenshots or outputs you need if it helps to get to the bottom of this.

      1 Reply Last reply Reply Quote 0
      • olivierlambertO Offline
        olivierlambert Vates πŸͺ Co-Founder CEO
        last edited by

        @julien-f can you remind me the name of the CLI tool to debug wrong LDAP config?

        julien-fJ K 2 Replies Last reply Reply Quote 0
        • julien-fJ Offline
          julien-f Vates πŸͺ Co-Founder XO Team @olivierlambert
          last edited by

          @olivierlambert xo-server-auth-ldap.

          1 Reply Last reply Reply Quote 1
          • K Offline
            kagbasi-wgsdac @olivierlambert
            last edited by

            @olivierlambert

            I had already posted the output of the test-cli.js utility at the beginning of this thread, however, if you want I can do it again just to re-confirm things. Just let me know, thanks.

            1 Reply Last reply Reply Quote 0
            • olivierlambertO Offline
              olivierlambert Vates πŸͺ Co-Founder CEO
              last edited by

              Okay so to me it's either a weird configuration thing or a library problem in your context.

              I don't know what else to do form a community point of view. You might ask on Passport library if the problem rings a bell.

              @julien-f is there anything else you think we can do as far it is community support?

              K 1 Reply Last reply Reply Quote 0
              • K Offline
                kagbasi-wgsdac @olivierlambert
                last edited by

                @olivierlambert I am very grateful for the assistance thus far. I definitely understand that your time is money, and I'm willing to approach my Church Leadership with a request to purchase the Enterprise License. However, do you offer any discounts off the annual subscription for Non-Profits Organizations? I'd be happy to take this discussion offline if you prefer (kagbasi at wgsdac.org).

                Secondly, is this the correct GitHub project for the passport library you mentioned: https://github.com/vesse/passport-ldapauth/issues ? If so, I'll try posting a question there as well, as you've suggested.

                julien-fJ 1 Reply Last reply Reply Quote 0
                • olivierlambertO Offline
                  olivierlambert Vates πŸͺ Co-Founder CEO
                  last edited by

                  Checking with @julien-f

                  1 Reply Last reply Reply Quote 0
                  • julien-fJ Offline
                    julien-f Vates πŸͺ Co-Founder XO Team @kagbasi-wgsdac
                    last edited by

                    @kagbasi-wgsdac From what I understand, there is no issue in the XO plugin itself (because it's working in many cases), it appears to be related to your LDAP/AD configuration, and unfortunately we cannot help regarding this as each LDAP/AD can be configured differently 😬

                    The library we are using to connect to LDAP is https://github.com/ldapts/ldapts but I don't think that will help because it's more likely something on your server's side.

                    K 1 Reply Last reply Reply Quote 0
                    • K Offline
                      kagbasi-wgsdac @julien-f
                      last edited by

                      @julien-f Hmm, that's a bit disappointing that there isn't much you guys can do to help. No worries, I'll keep testing. My AD environment works fine, since the accounts in question are not locked and are being used daily. The only place they're failing is in XOCE or XOA.

                      It's gotta be something with how the library is handling characters in either the username or the password. I'll keep testing until I can find a repeatable pattern.

                      Thanks to both you and @olivierlambert for the help thus far.

                      1 Reply Last reply Reply Quote 0
                      • K Offline
                        kagbasi-wgsdac
                        last edited by

                        RESOLVED β€” root cause found, three years later. Leaving a full write-up for anyone who lands here from a search.

                        Short version: this was never an XO bug, and it was never intermittent. The answer was sitting in the very first test-cli.js output I posted back in May 2023, and I misread it β€” as did everyone else in this thread, myself very much included.

                        The line that mattered

                        failed to bind as CN=Agbasi\, Kismet,...:
                        80090308: LdapErr: DSID-0C090434, comment: AcceptSecurityContext error, data 569, v4f7c
                        

                        We all pattern-matched AcceptSecurityContext error to "bad credentials" and moved on. But the meaning is entirely carried by the data field, which is the underlying Win32 status in hex:

                        • data 52e = 0x52E = 1326 = ERROR_LOGON_FAILURE β€” this is the "wrong password" one
                        • data 525 = 1317 = ERROR_NO_SUCH_USER
                        • data 532 = 1330 = password expired
                        • data 775 = 1909 = account locked out
                        • data 569 = 0x569 = 1385 = ERROR_LOGON_TYPE_NOT_GRANTED

                        I was getting 569, not 52e. My password was correct all along. AD validated it, then refused the logon type.

                        Why that happens

                        xo-server-auth-ldap verifies a password the only way LDAP allows β€” it re-binds to the directory as the user. Against Active Directory, an LDAP simple bind to a DC is processed as a Type 3 (network) logon on that DC.

                        So if an account is caught by "Deny access to this computer from the network" (SeDenyNetworkLogonRight) in the Default Domain Controllers Policy (or any other WINNING GPO, for that matter), it cannot complete an LDAP bind β€” no matter how correct the password is, and no matter which LDAP client is asking.

                        My environment uses a tiered admin model. Non-domain-admin admin groups are explicitly denied network logon to the DCs. My admin account is in those groups. Hence 569, every single time, by design.

                        Why it looked intermittent

                        It wasn't. I sampled it either side of a config change.

                        I could prove a bind had succeeded recently, because my LDAP-only XO account (no local password on the record at all) minted an API token on 28 July. Then on 31 July I restored RBAC settings on the Default Domain Controllers Policy that had drifted at some
                        point β€” I found that during unrelated PKI work. GptTmpl.inf last-write confirms it. The token's last successful use is about eleven hours before that edit.

                        Two deterministic states, one config change in the middle. That's the whole "intermittency."

                        My 2023 "seven security groups" theory was wrong

                        For the record, since it's still up there and someone will find it: I removed group memberships one at a time until auth worked, and concluded there was a membership count limit. There isn't. My own control test disproved it at the time β€” adding fifteen groups
                        never reproduced the failure β€” and I should have taken that seriously instead of filing it under "weird." The variable was never the count. It was which group. One of the removals happened to drop the account out of a denied group.

                        My other closing theory in this thread β€” special-character handling in the username or password β€” was also wrong. Getting 569 back proves AD parsed the escaped DN (CN=Agbasi\, Kismet), found the object, and got as far as evaluating the password. A mangled DN gives you 525 or a DN syntax error, not a logon-rights rejection. ldapts and passport were behaving correctly throughout.

                        How to check this in 60 seconds

                        1. Run the plugin test CLI and note the data value. Convert hex β†’ decimal, look it up in Microsoft's System Error Codes list.

                        2. On the DC, look for Security event 4625 with Sub Status 0xC000015B (STATUS_LOGON_TYPE_NOT_GRANTED).

                        3. Fastest test of all β€” from a workstation, as the affected account: net use \\dc01\sysvol. If network logon to the DC is denied, this fails too, and you've confirmed it without touching XO at all.

                        4. Check the policy directly:

                          $p = "\\mydomain.net\SYSVOL\mydomain.net\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}" + "\Machine\Microsoft\Windows NT\SecEdit\GptTmpl.inf"
                          Select-String -Path $p -Pattern "SeDenyNetworkLogonRight|SeNetworkLogonRight"
                          
                        5. Resolve the SIDs and see whether your user is in any of the denied groups.

                        Also worth checking your grant side: if Access this computer from the network doesn't list Authenticated Users directly, ordinary users are probably getting it transitively via Pre-Windows 2000 Compatible Access. Worth confirming before you assume a plain
                        non-privileged account will work.

                        What I am NOT doing

                        Removing those groups from the deny right. It's doing exactly what I rebuilt it to do. Restoring an app login by handing admin groups network access to the DCs for SMB/RPC/LDAP is a bad trade, and I'd just be undoing my own remediation.

                        Fix

                        • Interim: local XO accounts for the admins who need them. No AD objects created, nothing to unwind later, per-user attribution preserved in the audit log.
                        • Long term: federate XO through Keycloak (OIDC) instead of LDAP. Kerberos ticket issuance is a KDC service operation and is not gated by SeNetworkLogonRight β€” which is exactly why these accounts log into workstations all day while failing an LDAP bind.

                        ⚠️ Important if you go the Keycloak route: Keycloak's LDAP user federation validates passwords by doing an LDAP bind. Configure it that way and you'll hit data 569 inside Keycloak instead of inside XO and gain nothing. Password validation has to be delegated to
                        Kerberos/GSSAPI.

                        This will bite you on anything else you point at LDAP too β€” Bitwarden, NPM, TrueNAS, the lot. Worth solving once at the IdP.

                        One request for Vates

                        @olivierlambert @julien-f β€” you were right that it was environmental, and I owe you both thanks for the time you put in back in 2023.

                        That said, there's a real (small) improvement available here. xo-server collapses every auth provider exception into a generic invalid credentials, and the plugin only emits the actual AD error at DEBUG. The DC told us precisely what was wrong on the very first
                        attempt β€” it just never reached anywhere a user would look.

                        Surfacing the LDAP result code and the AD data sub-code at INFO on failure, and in the plugin test output in the UI, would turn this class of problem from a multi-year hunt into a single-session diagnosis. Happy to open an issue on GitHub with the full reproduction if that's useful.

                        Hope this saves someone else three years. If you found this thread by searching data 569, *ERROR_LOGON_TYPE_NOT_GRANTED**, or "LDAP invalid credentials but password is correct" β€” check your Deny access to this computer from the network user right first. That's almost certainly it.

                        1 Reply Last reply Reply Quote 0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better πŸ’—

                        Register Login
                        • First post
                          Last post