asp.net действие аутентификации MVC не получает returnUrl - PullRequest
1 голос
/ 10 ноября 2010

В классическом примере аутентификации asp.net/mvc действие LogOn получает LogOnViewModel и строку returnUrl для выполнения аутентификации и перенаправления на предыдущий URL.

[HttpPost]
public ActionResult LogOn(LogOnViewModel model, string returnUrl)
{
if (ModelState.IsValid)
    if (!FormsAuthentication.Authenticate(model.UserName, model.Password))                                              
        ModelState.AddModelError("", "Incorrect user name or password."); 

    if (ModelState.IsValid)
    {
        FormsAuthentication.SetAuthCookie(model.UserName, false);
        return Redirect(returnUrl ?? "Bookings");
    }
    else
        return View();
}

Но когда запрос обрабатывается действием, параметр returnUrl имеет значениеnull, однако должно быть значение, как говорит автор.Может ли кто-нибудь объяснить это?

Форма, из которой я отправляю запрос, выглядит следующим образом: Views / Admin / LogOn.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  <div id="login">
    <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm("LogOn", "Admin")) { %>
      <%= Html.ValidationSummary(true) %>
      <div><label>Username:</label><input name="userName" type="text" /></div>
      <div><label>Password:</label><input name="password" type="password" /></div>
      <div><input type="submit" value="Login" /></div>
    <% } %>
  </div>
</asp:Content>

В форме не создано скрытого поля.

Аутентификация:

<authentication mode="Forms">
  <forms loginUrl="~/Admin/LogOn" timeout="2880">
    <credentials passwordFormat="SHA1">
      <user name="admin" password="hashedPassword"/>
    </credentials>
  </forms>
</authentication>

Ответы [ 2 ]

6 голосов
/ 10 ноября 2010

Когда вы переходите на страницу, которая не аутентифицирована, параметр ReturnURL автоматически добавляется в строку запроса, когда вы перенаправляетесь на страницу входа в систему с помощью инфраструктуры MVC.

Ваш текущий тег <form> в представлении не учитывает это.Он всегда выполняет одно и то же действие, игнорируя любые существующие значения QueryString.

Если вы используете:

<% using (Html.BeginForm()) { %>
   // enter form html without the <form> tag
<% } %>

Это автоматически создаст тег <form> со значением 'action', которое учитываетлюбые строки запроса, которые уже существуют на вашей странице.

1 голос
/ 10 ноября 2010

Возможно попробуйте включить скрытый элемент ввода в вашу форму:

<%:Html.Hidden("returnUrl", yourUrlHere) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...