Wednesday, July 11, 2012

OBIEE 11 & IFRAME + Unexpected Problem

לקוח ביקש ממני לבדוק בעיה כלשהי שהייתה להם עם OBIEE 11 המשולב בתוך iframe.
לשם כך הייתי צריך להעביר את OBIEE 11 על המחשב שלי למצב בו זה אפשרי.
למה זו בכלל בעיה? בגלל נושאי אבטחה, כרגיל. כברירת מחדל אופציה זו חסומה. זה מה שאורקל אומרת בנושא:
Framebusting is a way to prevent clickjacking, which occurs when a malicious web site pulls a page originating from another domain into a frame and overlays it with a counterfeit page, allowing only portions of the original, or clickjacked, page (for example, a button) to display. When users click the button, they in fact are clicking a button on the clickjacked page, causing unexpected results.
 
אז מה עושים? הפתרון הוא די סטנדרטי ומתועד היטב בכמה בלוגים או באתר התמיכה של אורקל, למשל במסמך:
OBIEE content can not be displayed in the iframe [ID 1336401.1]
(למרות שמשום מה יש הרבה מקומות, כולל אתר התמיכה המדברים רק על החלק הראשון של הפתרון) 

בגדול יש שני שלבים בפתרון:
שלב 1: עדכון instanceconfig.xml שנמצא לרוב תחת התקנת OBIEE במחיצה:
\instances\instance1\config\OracleBIPresentationServicesComponent\coreapplication_obips1

שלב 2: עדכון web.xml שנמצא לרוב תחת התקנת OBIEE במחיצה:
\oracle_BI1\bifoundation\web\app\WEB-INF

שלב 1
ב instanceconfig.xml אמורה להיות כניסת security, כברירת מחדל היא ניראת כך:
<Security>
       <!--This Configuration setting is managed by Oracle Enterprise Manager Fusion Middleware Control-->
       <ClientSessionExpireMinutes>210</ClientSessionExpireMinutes>
</Security>
יש להוסיף לה שורה המטפלת בפרמטר InIFrameRenderingMode. לפרמטר זה 3 ערכים אפשריים:
1. prohibit - זאת ברירת המחדל שמוגדרת כשאין כלום ואוסרת כל סוג של iframe.
2. allow - שמאפשר הכל.
3. sameDomainOnly - המאפשרת iframe רק אם הדף המכיל נמצא באותו הדומיין של OBIEE.

במקרה שלי, שיניתי את כניסת הsecurity לזה:
<Security>
          <!--This Configuration setting is managed by Oracle Enterprise Manager Fusion   Middleware Control-->
          <ClientSessionExpireMinutes>210</ClientSessionExpireMinutes>
          <InIFrameRenderingMode>allow</InIFrameRenderingMode>
</Security>

שלב 2
בweb.xml יש להוסיף את קטע הקוד הבא:
    <context-param>
        <param-name>oracle.adf.view.rich.security.FRAME_BUSTING</param-name>
        <param-value>never</param-value>
    </context-param>
המשמעות כאן הפוכה ופירושו של never הוא לעולם לא לחסום.
אז אצלי הכנסתי את הקטע הזה לפני הפסקה (שכבר הייתה קיימת):
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
</login-config>

האמת היא שיש גם שלב 3 כי לפעמים, במיוחד אם בURL יש סיסמא, יש להכניס את שרת OBIEE ואולי גם את השרת המכיל בTrusted Sites תחת כניסת הSecurity בדפדפן שלכם.




עשיתי את כל זה ופניתי שמח וטוב לב 

להפעיל את קוד הHTML התוחכם הבא:


<html>
<body>
<iframe src="http://bdahab-il:7001/analytics/saw.dll?Go&Options=fdr&path=/shared/Sample%20Lite/Custom+Group&NQUSER=user&NQPASSWORD=password&syndicate=Siebel"></iframe>
</html>
(שזה בגדול:
<html><body><iframe src="OBIEE URL"></iframe> </html>

ועל OBIEE URL נדבר בהמשך)

הכל עבד מצויין בכרום ובIE אבל בפיירפוקס קיבלתי את ההודעה המעצבנת הבאה:
OBIEE content can not be displayed in the iframe
רגע... זה בדיוק מה שהמסמך הנ"ל מהתמיכה אמור למנוע!!!
כאן באו מספר מילים שנצנזר מפי, קריאה חוזרת של המסמך... עד שהבנתי.
הלכתי ובאכזריות מחקתי את כל ההסטוריה והעוגיות מהדפדפן (בפיירפוקס זה נמצא תחת options/privacy). 
ואז לשמחתי, הכל עבד.

No comments:

Post a Comment