【发布时间】:2009-02-27 16:19:11
【问题描述】:
当用户单击我的站点中需要身份验证的链接时,浏览器将被重定向到登录页面。登录页面包含一个 returnUrl 查询字符串参数。问题是,如果用户使用 OpenID 进行身份验证,提供商会将用户重定向回登录页面并且不包含 returnUrl 参数,这很无聊,因为我将用户重定向到主页而不是尝试过的页面.
我正在使用 DotNetOpenID,有没有办法解决这个问题?
【问题讨论】:
标签: openid dotnetopenauth
当用户单击我的站点中需要身份验证的链接时,浏览器将被重定向到登录页面。登录页面包含一个 returnUrl 查询字符串参数。问题是,如果用户使用 OpenID 进行身份验证,提供商会将用户重定向回登录页面并且不包含 returnUrl 参数,这很无聊,因为我将用户重定向到主页而不是尝试过的页面.
我正在使用 DotNetOpenID,有没有办法解决这个问题?
【问题讨论】:
标签: openid dotnetopenauth
这真的很容易,布鲁诺。只需拨打电话
IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]);
这将告诉 DotNetOpenId 保留登录页面上的 returnUrl 参数并获得您想要的行为。我不同意 Franci 关于将显示登录页面的 URL 与处理结果的 URL 分开的观点。对于 ASP.NET MVC 站点,可能是合适的,但对于 ASP.NET Web 表单,这确实不是要走的路,因为除了向用户显示任何错误之外,您无疑还想也再次显示登录表单。此外,就逻辑分离而言,DotNetOpenId 库为您完成了所有繁重的工作,因此您的代码隐藏页面中几乎没有任何逻辑。
【讨论】:
如果希望 OpenID 提供者返回不同的 url,则需要在创建身份验证请求时使用 OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) 方法。
但是,通常您不希望 OpenID 提供程序重定向回在您的应用中启动登录序列的 url。您想回到您启动 OpenID 身份验证以正确处理响应的位置。帮助将 OpenID 层与应用中的其余逻辑封装在一起。
这是一个例子:
在我的 ASP.NET MVC 应用程序中,我有一个带有 Authenticate 操作的 User 控制器来处理登录请求。
Authenticate 操作检查 OpenIdRelyingParty.Response。如果是null,则操作调用RedirectToProvider。提供者返回到相同的操作,我检查Respons.Status。如果是AuthenticationStatus.Authenticated,我使用FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true) 回到用户发起登录序列的页面。
但是,如果状态为AuthenticationStatus.Failed 或“AuthenticationStatus.Canceled”,我可以为用户提供解决此问题的步骤。如果输入错误,我可以让他们更正他们的 OpenID,或者改为使用用户名/密码登录。 (我支持同一身份的 OpenID 和用户名/密码身份验证)
我的登录框在每个页面上。如果 OpenID 提供程序将我重定向回发起登录请求的页面,则该页面可能无法正确处理失败。
【讨论】: