2016-02-01 25 views
1

我能夠通過HTTPWEBREQUEST從VB.NET代碼隱藏中成功使用datazen進行外部認證,但我不清楚如何將此與iframe或甚至div一起使用。我在想也許授權cookies/token不是跟隨iframe? datazen開始正確加載,但隨後它會重定向回登錄頁面,就好像它沒有被認證一樣。不知道如何做到這一點,這對我來說是非常新的,任何幫助將不勝感激!在具有外部認證的iframe中使用Datazen

網頁錯誤包括:

-Options URL發送@ jquery.min.js:19b.extend.ajax @ jquery.min.js:19Viewer.Controls.List.ajax @腳本網頁=名單:35Viewer.Controls.List.load @腳本頁面=列表:??35h.callback @腳本頁面=名單:35 VM11664有關:srcdoc:1周

的XMLHttpRequest無法加載http://datazenserver.com/viewer/jsondata。預檢的響應具有無效的HTTP狀態代碼405Scripts?page = list:35

load():未能加載JSON數據。 V ... rC ... s.List {version:「2.0」,description:「KPI & dashboard list loader & controller」,url:「/ viewer/jsondata」,index:「/ viewer /」,json:null ...}(anonymous函數)@腳本?page = list:35c @jquery.min.js:4p.fireWith @ jquery.min.js:4k @ jquery.min.js:19r @ jquery.min.js:19 腳本?page = list :35

GET http://datazenserver.com/viewer/login 403(禁止)(匿名函數)@腳本頁=名單:35 @ jquery.min.js:4p.fireWith @ jquery.min.js:4K @ jquery.min.js :19r @ jquery.min.js:19

  ' ''////////////////////////////////// 
 
      Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create("http://datazenserver.com/"), HttpWebRequest) 
 
      myHttpWebRequest.CookieContainer = New System.Net.CookieContainer() 
 

 
      Dim authInfo As String = Session("Email") 
 

 

 
      myHttpWebRequest.AllowAutoRedirect = False 
 

 
      myHttpWebRequest.Headers.Add("headerkey", authInfo) 
 
      myHttpWebRequest.Headers.Add("Access-Control-Allow-Origin", "*") 
 
      myHttpWebRequest.Headers.Add("Access-Control-Allow-Headers", "Accept, Content-Type, Origin") 
 
      myHttpWebRequest.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") 
 

 
      Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse) 
 
      Response.AppendHeader("Access-Control-Allow-Origin", "*") 
 

 
      ' Create a new 'HttpWebRequest' Object to the mentioned URL. 
 

 
      ' Assign the response object of 'HttpWebRequest' to a 'HttpWebResponse' variable. 
 
    
 
      Dim streamResponse As Stream = myHttpWebResponse.GetResponseStream() 
 
      Dim streamRead As New StreamReader(streamResponse) 
 

 

 
      frame1.Page.Response.AppendHeader("Access-Control-Allow-Origin", "*") 
 
      frame1.Page.Response.AppendHeader("headerkey", authInfo) 
 
      frame1.Attributes("srcdoc") = "<head><base href='http://datazenserver.com/viewer/' target='_blank'/></head>" & streamRead.ReadToEnd()

回答

1

您可能需要做更多的這個客戶端,我不知道您是否能夠出於安全考慮。

在Datazen外部驗證看起來是這樣的:

User-Agent   | Proxy    | Server 
-------------------|----------------------|------------------------------------ 
1. /viewer/home --> 2. Append header --> 3. Check cookie (not present) 
        <-- 5. Forward  <-- 4. Redirect to /viewer/login 

6. /viewer/login --> 7. Append header --> 8. Append cookie 
        <-- 10. Forward  <-- 9. Redirect to /viewer/home 

11. /viewer/home --> 12. Append header --> 13. Check cookie (valid) 
        <-- 15. Forward  <-- 14. Give content 

16. .................. Whatever the user wanted .......................... 

所以即使你有頭工作過的代理,你仍然得到一個cookie回它使用。

現在,這只是上下文。我想,從你對症狀的描述來看,myHttpWebResponse應該有一個cookie集(DATAZEN_AUTH_TOKEN,我相信),但它本質上已經被拋出 - 你不會在任何地方使用它。

您需要告訴瀏覽器客戶端將該cookie附加到對您的Datazen服務器域的任何後續(基於iframe的)請求,但我不認爲這可能是由於安全限制。不過,我對CORS一無所知,所以可能有辦法允許它。

我不知道是否有任何好方法來做你想要在這裏做的。充其量,我可能會想到一個可行的黑客入門,但我甚至找不到一個好方法來完成這項工作,而且你真的不想去那裏。

從本質上講,如果你正在尋找嵌入Datazen在iframe中,我會迴避外部認證了。無論如何,我都會避開它,但尤其是那裏。

但是,如果你絕對相信你需要它在像ADFS,你需要一些方法來獲得該cookie到您的iframe請求。


我能想到的,使這項工作的唯一辦法是把一切都在同一個域:

  • www.example.com
  • datazen.example.com(這可能是您的代理)

然後,您可以從響應中設置一個cookie,用於存儲Session("Email")的一些加密(並可能到期)表單,並將其傳回喲你的HTML。

這使得你的iframe相對簡單,因爲你可以告訴它加載查看器回家。東西的效果:

<iframe src="//datazen.example.com/viewer/home"></iframe> 

在你的代理,你會發現該cookie由Web服務器設置,解密電子郵件令牌,確保它不會過期,然後設置對後續請求中的包頭到Datazen服務器。

這可能會在幾個地方進行簡化,但這應該保持儘可能忠實於原始的實現,只要你能夠與DNS設置混亂。


我想這個的另一個版本可能涉及到傳遞一個參數到您的代理,並共享一些常見的加密密鑰。那會讓你過去不得不在同一個域名上。

所以,如果你有這樣的事情:

var emailEncrypted = encrypt(Session("Email") + ":somesalt:" + DateTime.UtcNow.ToString("O")); 
然後使用要與設置您的iframe了任何模板語言

<iframe src="//{{ customDomain }}/viewer/home?emailkey={{ emailEncrypted }}"></iframe> 

然後代理檢測emailkey參數,解密它,並檢查過期,這可能工作。

現在你可以選擇如何處理這個問題了,因爲Datazen會給你一個302到/viewer/login來獲取一個cookie,並且你需要確保通過正確的emailkey

  1. 我會做什麼,你能接受你的代理emailkey參數,自己設置一個全新的cookie,然後看對後續請求該Cookie。

    雖然在這一點上,將外部認證模式切換爲僅使用cookie可能是合理的。無論如何,這可能是一個更好的版本,假設這是你使用Datazen的唯一地方,並且你可以安全地改變如此基本的東西。這將大大減少您的業務邏輯。

    但是,你不需要。如果你不想改變它,你可以檢查cookie,並把它變成一個標題。

  2. 你應該做(1),但只是爲了好的衡量,我不確定的一件事是,你是否可以直接通過用戶/viewer/login從Datazen獲取cookie。通常情況下,你不會,但它看起來應該能夠。

    假設它按預期工作,您可以將該URL換出。據我所知(雖然我不得不仔細檢查一下),但實際上只需要一次頭部來設置cookie。所以,如果你這樣做,你應該得到的cookie,然後不再需要的URL參數,所以強迫導航將不擔心。

當然,你會確保你有一個很好的加密形式,到期模式是重要的。但是,如果你做得對,你應該能夠保證這一點。

+0

是的,我能夠獲得並添加DATAZEN_AUTH_TOKEN cookie到我的請求/響應(我做了這篇文章後),我想我也在某個地方做了錯誤,但你說得對,它似乎在某個點上迷路了太。我可以看到網絡響應中的所有內容,就像我通過身份驗證一樣,但我不知道如何正確處理它。請原諒我的新手能力與這個網絡請求的東西。我也試着用ajax做這個客戶端,但是我永遠無法正確地通過這種方式進行身份驗證。 – Luke

+0

@Luke我真的不記得'HttpWebRequest'中Cookie的默認行爲,但我可以想象它是否通過重定向支持它們,在這種情況下,這是有道理的。你的迴應將有一個完全認證的機構,但是你把它放在一個iframe中,而你的cookie當然不會隨着它傳遞下去。我真的不確定是否有可靠的方法來做到這一點。除非我想,如果您可以將所有內容放在同一個域中(包含子域),您可以設置一個cookie並將其用於您的代理,或者直接用於外部認證。這將工作。 –

+0

@Luke我編輯了一下我的答案,以增加一個關於如何工作的理論。再次,我不知道CORS有多少,但這應該避免最令人頭痛的問題。至少這是一些東西。對於它的價值,我可以在一定程度上肯定地告訴你,從長遠來看,這會變得非常麻煩,除非你絕對需要它,否則你可能不應該繼續走下去。外部認證已被棄用,並且現在幾乎不受支持。我理解你的用例,我相信這應該起作用,但這些是我的警告語。 –

0

我最終只是抓住用戶名和密碼字段,並用javascript輸入它們。但這piece幫了我一噸。你必須確保你設置的

document.domain ='basedomain.com';

在這兩個網站上的JavaScript

才能訪問iframe的內容否則你會碰到跨域問題。