我想知道是否可以执行 RedirectToProvider 并将生成的 OpenID 提供程序页面显示在 iFrame 中。这将使身份验证流程看起来更加精简。
我在 ASP.NET MVC (VB) 中使用 DotNetOpenID 库。
下一部分是一个单独的问题,但是是相关的。
我将 Ajax.BeginForm 用于 OpenID 登录表单,但是 RedirectToProvider 出于某种原因在此处失败。DotNetOpenId 不能与 MVC 和 AJAX 一起使用吗?
我想知道是否可以执行 RedirectToProvider 并将生成的 OpenID 提供程序页面显示在 iFrame 中。这将使身份验证流程看起来更加精简。
我在 ASP.NET MVC (VB) 中使用 DotNetOpenID 库。
下一部分是一个单独的问题,但是是相关的。
我将 Ajax.BeginForm 用于 OpenID 登录表单,但是 RedirectToProvider 出于某种原因在此处失败。DotNetOpenId 不能与 MVC 和 AJAX 一起使用吗?
是的,DotNetOpenId 支持 iframe、MVC 和 Ajax。与库一起提供并显示在其中一个示例中使用的OpenIdAjaxTextBox
控件证明了这一点。它不使用 iframe 来显示任何内容。它将它们与 checkid_immediate 一起使用来尝试隐式登录而无需任何用户交互,这是 OpenID 打算支持的唯一 iframe 场景。
该IAuthenticationRequest.RedirectToProvider
方法在内部调用 ASP.NET Response.Redirect
,它本身会抛出 a ThreadAbortException
,这可能就是为什么它似乎对您来说失败了,而实际上它可能是按设计工作的,但该设计与您可能尝试做的事情相冲突。
有多种方法可以完成您想要完成的工作,但正如 Workshop Alex 已经建议的那样,将 Provider 的页面托管在 iframe 中存在安全问题。这并不是说 RP 可以访问或处理 iframe 的内容,因为正如 EFraim 所说,除非浏览器存在无论如何都不允许的错误。它的两个问题是点击劫持,并且您正在训练用户被钓鱼,因为当 RP 的 URL 在位置栏中时,他可能会向他的 OP 提供他的登录凭据,这是一件坏事。
事实上,现在主要的 OP 在 iframe 中被激活时会故意拒绝工作,所以在努力让一切按照你想要的方式运行之后,你可能会对大多数客户无法使用而感到失望登录。
此外,正如您所指出的,弹出窗口在正确完成后可以帮助保持用户友好的体验。您也可以使用 DotNetOpenId 以几种不同的方式实现此目的。库附带的 ASP.NET 控件内置了此功能,只需在控件上设置属性即可激活。但是由于您使用的是 ASP.NET MVC(我认为),因此您可以自己执行以下操作:
当用户单击页面上的登录按钮,而不是 POST 到当前窗口时,使用 Javascript 在http://yoursite.com/openid/redirect?id= userSuppliedIdentifier 之类的 URL 处打开适当大小的弹出窗口。
您的 OpenID 控制器的重定向操作将读取该 ID,对该 ID 执行操作OpenIdRelyingParty.CreateRequest
,并且return IAuthenticationRequest.RedirectingResponse.AsActionResult()
(MVC 样式)。CreateRequest
请注意,如果您希望 OP 的响应返回到 OpenID 控制器上的不同方法,您可以将自己的 URL 传递给 returnTo url。
当断言返回时,您的控制器应该发送关闭弹出窗口的 javascript 并(根据需要)与主窗口通信以更新其登录用户的状态。
整个过程在 DotNetOpenId 附带的 ASP.NET 控件中完全自动化。不幸的是,ASP.NET MVC 不能像 ASP.NET Web 表单那样模块化,因此您不必自己完成所有这些工作。当然,DotNetOpenId 附带的 MVC 示例可以用来展示如何在未来版本中执行弹出行为。如果你想要,请提交一个愿望。
问题是,OpenID 提供商是否会认为这是一种安全风险?如果提供程序页面位于 IFrame 内,则周围的页面可以控制该框架内发生的事情,包括尝试捕获某些信息。这可能是一个潜在的漏洞利用风险。请记住,OpenID 提供者对这些事情非常偏执,甚至可能试图从这样的 IFrame 中突围,或者只是拒绝任何进一步的登录操作。这是他们可能不想承担的风险。是否可以?如果是,我认为答案也取决于提供者。