該賞金到期in 4天。此問題的答案有資格獲得 200聲望賞金。 LoLance想提請更多關注這個問題:
一些鏈接或代碼片段可能會更好。
問題描述:
假設我有一個 Web 應用程式(Java Saml2.0),它有一個登錄按鈕來呼叫 ADFS(身份提供者)進行身份驗證。
它使用 Javascript(Ajax 也有同樣的問題)來呼叫 ADFS 2016 的一個端點。由于如果從 Javascript/Ajax 發送請求,瀏覽器會拋出 CORS 錯誤。(ADFS2016服務器端不支持修改CORS header/response/origins)
我從某人那里聽說,避免 CORS 錯誤的一種方法是使用重定向而不是使用 Ajax/Javascript 直接呼叫一個 URL/端點。
有人可以對這種情況提供一些見解嗎?如何修改我的代碼以執行此類重定向而不會導致 CORS?
PS:我不想降低瀏覽器安全級別來繞過 CORS,我也不想升級到 ADFS2019,盡管它支持自定義 CORS 來源。
uj5u.com熱心網友回復:
我不確定你是否試圖通過使用這樣的 javascript 來實作一些特殊情況。但通常在使用 SAML 進行身份驗證時,您會從后端發出 HTTP 重定向,作為對用戶單擊登錄按鈕的回應。
要理解這一切,首先要了解我在這篇文章中介紹的 SAML 身份驗證流程。
- 用戶通過導航到受保護的頁面或在這種情況下單擊按鈕來觸發身份驗證
- 應用程式或 SAML 語言中的服務提供者 (SP) 構建 SAML 身份驗證請求并將其添加為 URL 引數并將其發送到 IdP,并向用戶發送后端 HTTP 重定向。身份驗證請求也可以使用此處解釋的HTTP POST 發送
- IdP 以它認為合適的方式對用戶進行身份驗證。
- IdP 使用 HTTP POST 連同 SAML 回應和 SAML 斷言將用戶發送回 SP。這包含身份驗證的結果以及有關用戶的任何額外資訊。
- SP,您的應用程式,解釋 SAML 回應并讓用戶通過受保護的應用程式。此重定向在 URL 中包含一個編碼的 SAML 身份驗證請求,由 ADFS 決議以了解身份驗證請求來自何處以及如何對用戶進行身份驗證。
有幾個庫和框架可用于管理 SAML 流量,包括使用重定向或其他方法發送訊息。如果您使用 Java,Spring 將 SAML 管理作為其安全框架的一部分。另一個庫是提供SAML 模塊的 PAC4J
雖然這兩種方法都適用于構建 SP 以與現有 IdP 集成的最一般用例,但如果您需要執行更多自定義案例或在您自己的 OpenSAML 上構建 IdP,則可以作為替代方案。OpenSAML 是用于處理 SAML 的更底層的庫。在我博客上的這篇文章中,我展示了如何使用來自 OpenSAML 的重定向來構建和發送 SAML 身份驗證請求。
下面是使用 OpenSAML 的簡化示例。有關完整示例,請參見此處和此處的示例代碼
身份驗證請求是使用 OpenSAML 構建的
AuthnRequest authnRequest = OpenSAMLUtils.buildSAMLObject(AuthnRequest.class);
authnRequest.setIssueInstant(Instant.now());
authnRequest.setDestination(IPD_SSO_DESTINATION);
authnRequest.setProtocolBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);
authnRequest.setAssertionConsumerServiceURL(SP_ASSERTION_CONSUMER_SERVICE_URL);
authnRequest.setID(RANDOM_ID);
authnRequest.setIssuer(ISSUER);
authnRequest.setNameIDPolicy(NAME_ID_POLICY);
將訊息添加到訊息背景關系并設定設定目標
MessageContext context = new MessageContext();
context.setMessage(authnRequest);
SAMLPeerEntityContext peerEntityContext = context.getSubcontext(SAMLPeerEntityContext.class, true);
SAMLEndpointContext endpointContext = peerEntityContext.getSubcontext(SAMLEndpointContext.class, true);
endpointContext.setEndpoint(MESSAGE_RECEIVER_ENDPOINT);
使用 HTTP 重定向發送訊息
HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder();
encoder.setMessageContext(context);
encoder.setHttpServletResponse(httpServletResponse);
encoder.initialize();
encoder.encode();
對于那些想要深入挖掘的人,我已經寫了一本關于使用 OpenSAML 的書,OpenSAML指南,以及關于將 SAML 作為框架的書,SAML 2.0:設計安全身份聯合。
我的博客上也有大量資源
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408080.html
標籤:
上一篇:django管理員特定重定向
下一篇:將用戶重定向到另一個鏈接
