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