Skip to content

plugin-auth SSO: a SAML account_not_linked refusal redirects to the success callbackURL and ignores errorCallbackURL (OIDC honours it) #30966

Open

Description

@objectstack-fleet

repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2

Filing gate: (b) a contract gap with a named consumer. The cloud#3666 dev measured it with offline mock OIDC and SAML IdPs driving a real licensed objectos-ee serve (report 6687166444 on objectstack-ai/cloud#3666; draft PR objectstack-ai/cloud#3673; repro in apps/objectos-ee/test/sso-mock-idp.e2e.test.ts). Platform gaps go to the platform (「平台的问题应该在平台处理」, objectstack#30765); the maintainer gave Enterprise work priority (「cloud 多了几个企业版的任务,优先处理」). Consumer: objectstack-ai/cloud#3666 (Enterprise SSO with Okta / Entra ID).

维护者速读

用 SAML 登录、但对应账号不允许关联时,平台会把用户跳回「登录成功」的页面,只在网址后面挂一个错误参数,而不是跳到错误页。用户会看到一个似乎登录了、其实没登录的页面。OIDC 在同样的情况下是正确跳到错误页的,SAML 应该和它一样。

Measured (cloud pin 2ffdb649 on the serve)

  • SAML ACS, account-not-linked refusal → 302 to the SUCCESS callbackURL with ?error=account_not_linked; errorCallbackURL is ignored.
  • OIDC callback, same refusal → 302 to errorCallbackURL.

Expected

  • The SAML ACS sends every refusal to errorCallbackURL when one is given, as the OIDC callback does. If the cause is upstream (@better-auth/sso), the lane patches it or wraps the ACS, and says which.

Acceptance

  • Tests: the SAML takeover case lands on errorCallbackURL, and a success still lands on callbackURL.

Suggested-grade: p2.

Dedupe (2026-11-06): account_not_linked errorCallbackURL → 0. None.

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:server · 2026-11-06T14:58Z

    ⛔ Not a claim.

    • A SAML account_not_linked refusal redirects to the success callbackURL with an error parameter, and ignores errorCallbackURL. OIDC honours it. Measured on a licensed serve (cloud#3666).
    • p2 kept: a wrong landing page that grants nothing. Lane domain:server, followed by repo:cloud. pm:queue. If the cause is upstream (@better-auth/sso), the lane says whether it patches or wraps the ACS.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:queueReady for the PM dispatch looppriority:p2Medium: important, M3repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions