如何使用 ASP.NET 和 iframe 跨域对用户进行身份验证?
Posted
技术标签:
【中文标题】如何使用 ASP.NET 和 iframe 跨域对用户进行身份验证?【英文标题】:How to authenticate users across domains using ASP.NET and iframes? 【发布时间】:2010-10-30 09:12:40 【问题描述】:我正在为一位客户创建一个 ASP.NET 网站,该客户希望通过 IFRAME 在其他“经销商”网站上提供他们的报告页面。 经销商网站提供具有不同品牌的相同服务。 我需要尽可能避免要求他们在其网络服务器上实现任何代码以启用此功能 - 因此使用 iframe。
用户将登录到经销商网站,加载一个包含 iframe 的页面,然后在主站点加载报告。 作为参数,我们将发送经销商 ID 和他们的用户名。
我们可以使用 SSL 服务器证书,但不能使用任何联合登录(如 OpenId)——这是客户端的业务选择。
问题是,主站点如何验证从经销商处加载页面的用户确实正在请求报告页面? 换句话说,如何跨域对用户进行身份验证,而不需要经销商实现代码..
任何想法将不胜感激!
【问题讨论】:
【参考方案1】:我可能遗漏了一些东西,但如果客户端通过了您的服务器的身份验证,那么如果您通过 iframe 查看它,它仍然会通过身份验证。
例如,在您的服务器上创建一个带有 iframe 到 gmail 的 html 页面。只要您在浏览器中通过 gmail 身份验证,您就会在该页面中看到您的收件箱...
【讨论】:
感谢您的回复。作为回答;他尚未针对第二个域进行身份验证。用户登录到域 A,从那里加载包含 iframe 的页面,该 iframe 从域 B 加载内容。如何在域 B 上验证用户,而不在 A 的服务器上实现(非 HTML)代码? 使用与用户登录您的网站时相同的机制。例如如果用户没有登录,他会看到登录页面...(再次,就像使用 gmail)【参考方案2】:对于您需要登录的每个域,您的登录表单可以使用一些 javascript 将登录表单发布到隐藏的 iframe(由于跨域安全问题,您不能使用 XMLHTTPRequest)。
请务必将您的 iframe 重定向回原始域,否则由于跨域安全性,您将无法从 iframe 中获取登录状态。
IE 支持的最后一个技巧是翻转邪恶位并添加
P3P: CP="CAO PSA OUR"
到您的 HTTP 响应标头。它告诉浏览器“老实说,我不会做任何坏事”。
http://support.microsoft.com/kb/323752
http://www.w3.org/P3P/
【讨论】:
很有趣,谢谢,还不确定是否有答案,但会调查一下。 抱歉,没有说清楚:经销商网站将用户登录到他们的服务器,并希望避免第二次登录。因此,如果转销商告诉主站点“Bob 在这里想要查看报告”,主站点可以查找用户 Bob,并且只要它可以验证请求确实来自授权转销商,就可以提供报告。有用的答案,我给你一点:)【参考方案3】:如果不在经销商网站上实现任何代码,我认为没有令人满意的方法来做到这一点。
相反,我会要求他们从经销商网络服务器向主网络服务器发送一个 HTTPS 请求,传递一个唯一的密钥来识别自己,以及他们登录用户的用户名。
在主站点上验证后,此密钥将用作经销商的身份验证,并扩展为他们的登录用户。
此请求的响应将包含一个 html 片段字符串,经销商可以将其注入任何页面。
该片段将包含一个 iframe,而该 iframe 反过来会使用登录用户的用户名直接从主站点加载登录用户的报告。 此报告内容将包含对特定于经销商的样式表的引用。
使用这种方法,我会说浏览器中不需要 HTTPS,因为经销商和他们的用户都经过身份验证,如果该过程通过 HTTPS 发生,我们可以假设没有窃听者。
在密钥或用户密码被泄露的情况下,来自浏览器的 HTTPS 无论如何都没有影响。
【讨论】:
以上是关于如何使用 ASP.NET 和 iframe 跨域对用户进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Asp.net 设置 .asmx webservice 启用跨域