1

我能够通过HTTPWEBREQUEST从VB.NET的代码隐藏中成功使用datazen的外部身份验证,但我不清楚如何将它与iframe甚至div一起使用。我在想也许授权 cookie/令牌没有遵循 iframe?datazen 开始正确加载,但随后它重定向回登录页面,就好像它没有经过身份验证一样。不知道如何做那部分,这些东西对我来说很新,任何帮助将不胜感激!

网页错误包括:

-OPTIONS url 发送 @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…rC…s.List {version: "2.0", description: "KPI & dashboard list loader & 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 Scripts?page=list: 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()

4

2 回答 2

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 了解不多,所以可能有办法允许它。

我不知道是否有任何好方法可以做你想做的事情。充其量,我可能会想到一个可行的 hack 的开始,但我什至找不到一个好的方法来实现它,你真的不想去那里。

本质上,如果您希望将 Datazen 嵌入 iframe,我会回避外部身份验证。无论如何,我都会回避它,但尤其是在那里。

但是,如果您绝对确定您需要它而不是 ADFS 之类的东西,您将需要一些方法来将该 cookie 放入您的 iframe 请求中。


我能想到的唯一方法是将所有内容放在同一个域中:

  • www.example.com
  • datazen.example.com(这可能是你的代理)

然后,您可以从您的响应中设置一个 cookie,该 cookie 存储一些加密(并且可能会过期)形式的Session("Email"),并将其传递回您的 html 中。

这使您的 iframe 相对简单,因为您可以告诉它加载查看器主页。大意是:

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

在您的代理中,您将检测 Web 服务器设置的 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,你需要确保通过emailkey它传递正确的信息。

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

    尽管到那时,将您的外部身份验证模式切换为仅使用 cookie 可能是合理的。无论如何,这可能是一个更好的版本,假设这是您使用 Datazen 的唯一地方,并且您可以安全地更改如此基本的东西。这将大大减少您的业务逻辑。

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

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

    假设它按预期工作,你可以换掉那个 URL。据我所知(尽管我必须仔细检查这一点),标题实际上只需要一次,以设置 cookie。所以如果你这样做了,你应该得到 cookie,然后不再需要 URL 参数,所以强制导航就不用担心了。

当然,您会想要确保那里有良好的加密形式,并且过期模式很重要。但如果你做得对,你应该能够确保这一点。

于 2016-02-01T23:01:53.970 回答
0

我最终只是抓住了用户名和密码字段并使用 javascript 输入它们。但这篇文章帮助了我很多。你必须确保你设置

document.domain ='basedomain.com';

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

于 2016-02-11T19:10:06.380 回答