当用户单击我的站点中需要身份验证的链接时,浏览器将被重定向到登录页面。登录页面包含一个 returnUrl 查询字符串参数。问题是,如果用户使用 OpenID 进行身份验证,提供商会将用户重定向回登录页面并且不包含 returnUrl 参数,这很无聊,因为我将用户重定向到主页而不是尝试过的页面.
我正在使用 DotNetOpenID,有没有办法解决这个问题?
当用户单击我的站点中需要身份验证的链接时,浏览器将被重定向到登录页面。登录页面包含一个 returnUrl 查询字符串参数。问题是,如果用户使用 OpenID 进行身份验证,提供商会将用户重定向回登录页面并且不包含 returnUrl 参数,这很无聊,因为我将用户重定向到主页而不是尝试过的页面.
我正在使用 DotNetOpenID,有没有办法解决这个问题?
这真的很容易,布鲁诺。打电话
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 应用程序中,我有一个带有处理登录请求User
的操作的控制器。Authenticate
动作Authenticate
检查。OpenIdRelyingParty.Response
如果是null
,则动作调用RedirectToProvider
。提供者返回到相同的操作,我在其中检查Respons.Status
. 如果是AuthenticationStatus.Authenticated
我用来返回用户启动登录序列的页面。FormsAuthentication.RedirectFromLoginPage
(openid.Response.ClaimedIdentifier, true)
但是,如果状态为AuthenticationStatus.Failed
“AuthenticationStatus.Canceled”,我可以为用户提供解决此问题的步骤。如果输入错误,我可以让他们更正他们的 OpenID,或者改为使用用户名/密码登录。(我支持同一身份的 OpenID 和用户名/密码身份验证)
我的登录框在每个页面上。如果 OpenID 提供程序将我重定向回发起登录请求的页面,则该页面可能无法正确处理失败。