如何更改OpenID的ReturnUrl?

时间:2009-02-27 16:19:11

标签: openid dotnetopenauth

当用户单击我的站点中需要身份验证的链接时,浏览器将重定向到登录页面。登录页面包含returnUrl查询字符串参数。问题是,如果用户使用OpenID进行身份验证,则提供程序会将用户重定向回登录页面,并且不包含returnUrl参数,这非常无聊,因为我将用户重定向到主页而不是尝试的页面

我正在使用DotNetOpenID,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:11)

这真的很容易,布鲁诺。只需致电

IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]);

这将告诉DotNetOpenId在登录页面上保留returnUrl参数并获得所需的行为。我不同意弗朗西关于将显示登录页面的URL与处理结果的URL分开。对于可能适合的ASP.NET MVC站点,但对于ASP.NET Web表单来说真的不是那种方法,因为除了向用户显示任何错误之外,你无疑会想要还会再次显示登录表单。此外,就逻辑分离而言,DotNetOpenId库为您完成了所有繁重工作,因此您的代码隐藏页面几乎没有任何逻辑。

答案 1 :(得分:3)

如果您希望OpenID提供程序返回到其他URL,则需要在创建身份验证请求时使用OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl)方法。

但是,通常您不希望OpenID提供程序重定向回在您的应用程序中启动登录序列的URL。您希望回到启动OpenID身份验证以正确处理响应的位置。帮助您从应用程序的其余逻辑中封装OpenID层。

以下是一个例子:

在我的ASP.NET MVC应用程序中,我有一个User控制器,其Authenticate操作处理登录请求。

Authenticate操作会检查OpenIdRelyingParty.Response。如果是null,则操作会调用RedirectToProvider。提供程序返回相同的操作,我在其中检查Respons.Status。如果是AuthenticationStatus.Authenticated,我会使用FormsAuthentication.RedirectFromLoginPage (openid.Response.ClaimedIdentifier, true)返回到用户启动登录序列的页面。

但是,如果状态为AuthenticationStatus.Failed或“AuthenticationStatus.Canceled”,我可以为用户提供解决此问题的步骤。如果输入错误或者使用用户名/密码登录,我可以让他们更正他们的OpenID。 (我支持相同身份的OpenID和用户名/密码身份验证)

我的登录框位于每个页面上。如果OpenID提供程序将我重定向回发起登录请求的页面,则该页面可能无法正确处理该故障。