SAML 플러그인 사용 시 AzureAD 오류 AADSTS7500525

안녕하세요!!

SAML 플러그인이 AzureAD와 함께 정상적으로 작동하고 있었지만, 어제 최신 커밋으로 업그레이드한 이후로 사용자가 SAML을 통해 인증을 시도할 때 다음과 같은 오류가 발생하기 시작했습니다:

Sign in
Sorry, but we’re having trouble signing you in.

AADSTS7500525: There was an XML error in the SAML message at line 1, position 1. Verify that the XML content of the SAML messages conforms to the SAML protocol specifications.

이 링크 Azure AD SAML2 request rejected: AADSTS7500525 - Microsoft Q&A 는 이 문제가 AzureAD가 지원하지 않는 "압축된 SAML 인증 요청(Compressed SAML Authentication Requests)

문제가 발생했다는 소식에 죄송합니다! 최근 몇 주간 SAML 플러그인에 대한 리팩터링을 많이 진행했기 때문에, 그와 관련이 있을 수도 있습니다.

이 문제가 언제 발생하나요? 사용자가 로그인을 시작할 때인가요? 아니면 Discourse로 돌아올 때인가요?

사이트 URL을 여기에 공유해 주시거나, 개인 메시지로 보내 주실 수 있으신가요?

사용자가 로그인해야 할 때마다(세션이 만료되었거나 새 사용자가 로그인하려고 할 때) 이 문제가 발생합니다.

9334abe249 리비전으로 업데이트한 이후부터 발생하기 시작했습니다(이전에는 959923d3cf였습니다).

죄송하지만 우리 포럼은 사설 AWS 계정의 내부에 호스팅되어 있어 네트워크 외부에서 접근할 수 없습니다.

에ラー가 어디에 나타나요? Discourse 로그인가요? 사용자 화면인가요? Azure인가요?

스크린샷을 공유해 주실 수 있나요?

디스코urs의 로그에서도 무언가를 찾아보려 했지만, 오류가 Azure 측에서 발생하기 때문에 거기서 오류 메시지를 찾지 못했습니다.

production.log에서는 로그인 프로세스가 여기서 멈춥니다 (아마도 Azure에서 반환을 기다리고 있는 것 같습니다):

Processing by StaticController#show as HTML
Parameters: {“id”=>“login”}
Rendered static/login.html.erb (Duration: 17.5ms | Allocations: 1440)
Completed 200 OK in 19ms (Views: 18.3ms | ActiveRecord: 0.0ms | Allocations: 2104)
Started GET “/session/csrf” for <> at 2021-12-14 18:28:16 -0300
Processing by SessionController#csrf as JSON
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 337)
Started POST “/auth/saml” for <> at 2021-12-14 18:28:16 -0300
(saml) Setup endpoint detected, running now.
(saml) Request phase initiated.

Azure를 담당하는 팀은 수신 중인 XML을 가져오려고 노력하고 있어, 그 안에서 뭔가 “다른” 점을 볼 수 있을지 확인해볼 수 있을 것입니다. 그들이 저에게 보내주면 알려드리겠습니다.

사용자가 로그인 버튼을 클릭한 후에 에러가 발생합니다.
그 후 다음 에러와 함께 Azure 로그인 페이지로 리디렉션됩니다:

사이트에 접근할 수 없기 때문에 여기서 무슨 일이 일어나고 있는지 파악하기가 어려울 것 같습니다.

다음 단계는 Azure에서 수신되는 XML을 가져와 그 XML에 어떤 문제가 있는지 확인하는 것입니다. 브라우저의 개발자 도구에서 페이로드를 확인한 후, 이 도구와 같은 도구를 사용하여 디코딩하면 됩니다.

좋습니다!

요청의 응답은 HTTP 코드 400입니다:

Request URL: https://login.microsoftonline.com/APP_ID/saml2
Request method: POST
Status code: 400 Bad Request
Remote address: 20.190.173.144:443
Referrer policy: strict-origin-when-cross-origin

압축이 해제된 SAMLRequest는 다음과 같습니다(개인정보 보호를 위해 일부 ID는 숨김 처리됨):

<samlp:AuthnRequest AssertionConsumerServiceURL='https://INTERNAL_URL/auth/saml/callback' Destination='https://login.microsoftonline.com/APP_ID/saml2' ID='_11111111-1111-1111-1111-111111111111' IssueInstant='2021-12-14T22:33:29Z' Version='2.0' xmlns:saml='urn:oasis:names:tc:SAML:2.0:assertion' xmlns:samlp='urn:oasis:names:tc:SAML:2.0:protocol'><saml:Issuer>https://INTERNAL_URL</saml:Issuer></samlp:AuthnRequest>

Single sign-on SAML (Security Assertion Markup Language) protocol - Microsoft identity platform | Microsoft Learn 의 예제와 제 요청을 비교하면서 발견한 한 가지가 있습니다. 제 AuthnRequest에는 다음 매개변수가 없습니다.

xmlns="urn:oasis:names:tc:SAML:2.0:metadata"

최근 리팩터링 과정에서 SAML POST 바인딩에 대한 압축 기능이 의도치 않게 추가된 것 같습니다. 해당 동작 변경 사항은 FIX: Do not compress SAML request for POST binding (#55) · discourse/discourse-saml@792a51c · GitHub 에서 되돌렸습니다.

SAML 플러그인을 업데이트한 후 문제가 해결되었는지 확인해 주시겠어요?

데이비드님, 안녕하세요.

FIX: Do not compress SAML request for POST binding (#55) · discourse/discourse-saml@792a51c · GitHub 으로 업데이트한 후, 여기서는 SAML 인증이 정상적으로 복구되었습니다.

도와주신 점과 플러그인 개발에 기울여 주신 노력에 감사드립니다.