9

我有一个 MVC4 应用程序,通过成员身份登录(通过 FormsAuthentication)。

这在 web.config 中定义如下。我的默认 url 是 home root (~/):

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

在 Login post 方法中的 AccountController 中,以下代码是相关的。当用户使用有效凭据单击登录时,将执行此代码。

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 方法

4

3 回答 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...
}

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

于 2013-09-16T15:15:26.617 回答
4

您的返回 URL 似乎没有任何问题:[ %2f is /]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。

于 2013-09-16T09:17:32.033 回答
2

这可能是因为该路径未被检测为相同的应用程序路径:

默认情况下,ReturnUrl 变量必须引用当前应用程序中的页面。如果 ReturnUrl 引用不同应用程序或不同服务器上的页面,则 RedirectFromLoginPage 方法将重定向到 DefaultUrl 属性中的 URL。如果要允许重定向到当前应用程序之外的页面,则必须使用表单配置元素的 enableCrossAppRedirects 属性将 EnableCrossAppRedirects 属性设置为 true。

来自:http: //msdn.microsoft.com/en-US/library/1f5z1yty.aspx

于 2013-09-13T16:22:14.883 回答