我能够通过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;
答案 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}通过那个。
我会做什么,您可以接受代理中的emailkey
参数,自己设置一个全新的Cookie,然后在后续请求中查看该Cookie。
虽然此时,将外部身份验证模式切换为仅使用Cookie可能是合理的。无论如何,这可能是一个更好的版本,假设这是你使用Datazen的唯一地方,你可以安全地改变一些如此根本的东西。这将大大减少您的业务逻辑。
但是,你不必这样做。如果你不想改变它,你可以检查一下cookie,然后把它变成一个标题。
你应该做(1),但只是为了好的措施,我不确定的一件事是,你是否可以直接将用户传递给emailkey
以从Datazen获取cookie。通常你不会,但似乎你应该能够。
假设它按预期工作,您可以将该URL换掉。据我所知(虽然我必须仔细检查一下),标题实际上只需要一次,以设置cookie。因此,如果您这样做,您应该获取cookie,然后不再需要URL参数,因此强制导航将无关紧要。
当然,您需要确保在那里获得了良好的加密形式,并且过期模式非常重要。但是,如果你做得对,你应该能够确保这一点。
答案 1 :(得分:0)
我最终只是抓取用户名和密码字段并使用javascript输入。但这piece给了我很多帮助。你必须确保设置
document.domain ='basedomain.com';
在两个网站上的javascript中访问iframe内容,否则您将遇到跨域问题。