在iframe中使用Datazen与外部身份验证

时间:2016-02-01 16:22:13

标签: asp.net vb.net-2010 datazen-server

我能够通过HTTPWEBREQUEST成功地使用带有VB.NET的代码隐藏的数据进行外部身份验证,但我不清楚如何将其用于iframe甚至是div。我想也许授权cookie /令牌不在iframe后面?数据开始正确加载,但随后它重定向回登录页面,就好像它没有经过身份验证一样。不知道怎么做那个部分,这个东西对我来说很新,任何帮助都会非常感激!!

网页错误包括:

-OPTIONS url send @ jquery.min.js:19b.extend.ajax @jquery.min.js:19Viewer.Controls.List.ajax @ Scripts?page = list:35Viewer.Controls.List.load @ Scripts?page = list:35h.callback @ Scripts?page = list:35 VM11664 about:srcdoc:1

XMLHttpRequest无法加载http://datazenserver.com/viewer/jsondata。预检的响应具有无效的HTTP状态代码405Scripts?page = list:35

load():无法加载JSON数据。 V ... r.C ... s.List {版本:" 2.0",描述:" KPI&仪表板列表装载机& controller",url:" / viewer / jsondata",index:" / viewer /",json:null ...}(匿名函数)@Scripts?page = list:35c @ jquery.min.js:4p.fireWith @jquery.min.js:4k @ jquery.min.js:19r @ jquery.min.js:19 ?脚本页=列表:35

GET http://datazenserver.com/viewer/login 403(禁止)(匿名函数)@ Scripts?page = list:35c @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()
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分: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,解密电子邮件令牌,确保它未过期,然后将后续请求的标头设置到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,你需要确保传递正确的{{1}通过那个。

  1. 我会做什么,您可以接受代理中的emailkey参数,自己设置一个全新的Cookie,然后在后续请求中查看该Cookie。

    虽然此时,将外部身份验证模式切换为仅使用Cookie可能是合理的。无论如何,这可能是一个更好的版本,假设这是你使用Datazen的唯一地方,你可以安全地改变一些如此根本的东西。这将大大减少您的业务逻辑。

    但是,你不必这样做。如果你不想改变它,你可以检查一下cookie,然后把它变成一个标题。

  2. 你应该做(1),但只是为了好的措施,我不确定的一件事是,你是否可以直接将用户传递给emailkey以从Datazen获取cookie。通常你不会,但似乎你应该能够。

    假设它按预期工作,您可以将该URL换掉。据我所知(虽然我必须仔细检查一下),标题实际上只需要一次,以设置cookie。因此,如果您这样做,您应该获取cookie,然后不再需要URL参数,因此强制导航将无关紧要。

  3. 当然,您需要确保在那里获得了良好的加密形式,并且过期模式非常重要。但是,如果你做得对,你应该能够确保这一点。

答案 1 :(得分:0)

我最终只是抓取用户名和密码字段并使用javascript输入。但这piece给了我很多帮助。你必须确保设置

document.domain ='basedomain.com';

在两个网站上的javascript中访问iframe内容,否则您将遇到跨域问题。