3

我想知道是否可以执行 RedirectToProvider 并将生成的 OpenID 提供程序页面显示在 iFrame 中。这将使身份验证流程看起来更加精简。

我在 ASP.NET MVC (VB) 中使用 DotNetOpenID 库。

下一部分是一个单独的问题,但是是相关的。

我将 Ajax.BeginForm 用于 OpenID 登录表单,但是 RedirectToProvider 出于某种原因在此处失败。DotNetOpenId 不能与 MVC 和 AJAX 一起使用吗?

4

2 回答 2

3

是的,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(我认为),因此您可以自己执行以下操作:

  1. 当用户单击页面上的登录按钮,而不是 POST 到当前窗口时,使用 Javascript 在http://yoursite.com/openid/redirect?id= userSuppliedIdentifier 之类的 URL 处打开适当大小的弹出窗口。

  2. 您的 OpenID 控制器的重定向操作将读取该 ID,对该 ID 执行操作OpenIdRelyingParty.CreateRequest,并且return IAuthenticationRequest.RedirectingResponse.AsActionResult()(MVC 样式)。CreateRequest请注意,如果您希望 OP 的响应返回到 OpenID 控制器上的不同方法,您可以将自己的 URL 传递给 returnTo url。

  3. 当断言返回时,您的控制器应该发送关闭弹出窗口的 javascript 并(根据需要)与主窗口通信以更新其登录用户的状态。

整个过程在 DotNetOpenId 附带的 ASP.NET 控件中完全自动化。不幸的是,ASP.NET MVC 不能像 ASP.NET Web 表单那样模块化,因此您不必自己完成所有这些工作。当然,DotNetOpenId 附带的 MVC 示例可以用来展示如何在未来版本中执行弹出行为。如果你想要,请提交一个愿望

于 2009-08-31T00:35:10.770 回答
2

问题是,OpenID 提供商是否会认为这是一种安全风险?如果提供程序页面位于 IFrame 内,则周围的页面可以控制该框架内发生的事情,包括尝试捕获某些信息。这可能是一个潜在的漏洞利用风险。请记住,OpenID 提供者对这些事情非常偏执,甚至可能试图从这样的 IFrame 中突围,或者只是拒绝任何进一步的登录操作。这是他们可能不想承担的风险。是否可以?如果是,我认为答案也取决于提供者。

于 2009-08-30T13:13:29.033 回答