C# ASP.Net MVC:RedirectFromLoginPage总是跳转到默认的URL,而不是returnurl。

9

我有一个使用Membership登录(通过FormsAuthentication)的MVC4应用程序。

这在web.config中定义如下。我的默认URL是主目录(~/):

<roleManager enabled="true" />
<authentication mode="Forms">
  <forms defaultUrl="~" loginUrl="~/Account" />
</authentication>

在我的AccountController的登录post方法中,以下代码是相关的。当用户使用有效凭据点击登录时,将执行此代码。
if (Membership.ValidateUser(creds.Username, creds.Password))
{
    FormsAuthentication.RedirectFromLoginPage(creds.Username, false);
    return null;
}

现在,如果我匿名地导航到:~/Admin,我将被重定向到~/Account以进行登录,这是完美的。我可以看到URL的格式如下:

http://localhost:23759/Account?ReturnUrl=%2fAdmin

但是,当我成功登录后,我被重定向到主页(~/),而不是 ~/Admin

请帮忙!非常感谢!

编辑:找到了实际问题:它是未接收查询字符串的POST方法


从MSDN(http://msdn.microsoft.com/en-us/library/ka5ffkce.aspx):假如ReturnURL变量不存在,RedirectFromLoginPage方法将会重定向到DefaultUrl属性中的URL。看起来像是.NET不知道Admin存在,也许斜杠(%2f)引起了这个问题? - Garrison Neely
3个回答

15

我找到了解决方案!感谢FlopScientist,他帮助我深入思考。

的确是因为我使用了POST方法,没有考虑到从GET获取的QueryString。

首先,我的视图是这样的:

@using (Html.BeginForm("Index", "Account")
{
    <div class="LoginBox">
    //Etc...
    </div>
}
我已经更新为以下内容:
@using (Html.BeginForm("Index", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] }, FormMethod.Post))
{
    //Etc...
}

现在,我实际上可以在我的调试中看到一个查询字符串,并且我确实获得了正确的重定向!


很高兴知道我能帮助到你。 - R.C

4

您的返回网址似乎没有任何问题: [ %2f 是 / ] localhost:23759/Account?ReturnUrl=%2fAdmin

因此,需要进行一些检查以确定是什么原因导致了这种行为。

1.) 您确定在返回网址中指定的返回页面:

localhost...?ReturnUrl=%2fAdmin

您是否确信Admin文件夹中的default.aspx页面实际存在且用户可以访问?如果不存在,RedirectFromLoginPage将默认重定向到DefaultURL

2.) 此外,尝试使用FormsAuthentication.GetRedirectUrl() 方法来查看会发生什么。

if (Membership.ValidateUser(creds.Username, creds.Password))
{
    Response.Redirect(FormsAuthentication.GetRedirectUrl(username, false));
}

3.) 或者这样行吗?[建议调试使用]

if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
{
    Response.Redirect("~/Admin");
}

最后,请确保没有这样的代码行将用户重定向到其他页面/DefaultURL。

我已经更新了我的问题,并附上了我的发现,以获得更好的格式。 - Recipe

2
可能是因为该路径未被检测为相同的应用程序路径:
默认情况下,ReturnUrl变量必须引用当前应用程序中的页面。如果ReturnUrl引用不同应用程序或不同服务器上的页面,则RedirectFromLoginPage方法将重定向到DefaultUrl属性中的URL。如果您想允许重定向到当前应用程序之外的页面,则必须使用forms配置元素的enableCrossAppRedirects属性将EnableCrossAppRedirects属性设置为true。
来自:http://msdn.microsoft.com/en-US/library/1f5z1yty.aspx

感谢您的建议。正如我在问题中所述(已更新),查询字符串似乎存在问题... - Recipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接