Возвращаемый URL не передается в форме входа в MVC

#c# #asp.net-mvc #asp.net-mvc-4

#c# #asp.net-mvc #asp.net-mvc-4

Вопрос:

У меня есть веб-сайт, где я добавляю аутентификацию прямо сейчас, следуя этому руководству (http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1 ) используя ASP.NET Идентификация, Owin и т.д… В настоящее время вместо использования помощников html и использования приведенного ниже фрагмента для просмотра я создал свою собственную пользовательскую форму, но по какой-то причине я не думаю, что я правильно передаю URL возврата, из-за чего я получаю ошибку 404. Кто-нибудь, пожалуйста, может мне помочь? Я новичок в .NET MVC. Заранее спасибо.

 @Html.ValidationSummary(true)

@using (Html.BeginForm())
{
  @Html.EditorForModel()
  <p>
    <button type="submit">Log In</button>
  </p>
}
  

Модель

 public class LogInModel
{
    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [HiddenInput]
    public string ReturnUrl { get; set; }
}
  

Контроллер

 [AllowAnonymous]
    public class AuthController : Controller
    {
        // GET: Auth
        [HttpGet]
        public ActionResult LogIn(string returnUrl)
        {
            var model = new LogInModel
            {
                ReturnUrl = returnUrl
            };

            return View(model);
        }

        [HttpPost]
        public ActionResult LogIn(LogInModel model)
        {
            if (!ModelState.IsValid)
            {
                return View();
            }

            // Don't do this in production!
            if (model.Email == "admin@admin.com" amp;amp; model.Password == "#G16#")
            {
                var identity = new ClaimsIdentity(new[] {
                new Claim(ClaimTypes.Name, "Admin"),
                new Claim(ClaimTypes.Email, "Admin@Admin.com"),
                new Claim(ClaimTypes.Country, "USA")
            },
                    "ApplicationCookie");

                var ctx = Request.GetOwinContext();
                var authManager = ctx.Authentication;

                authManager.SignIn(identity);

                return Redirect(GetRedirectUrl(model.ReturnUrl));
            }

            // user authN failed
            ModelState.AddModelError("", "Invalid email or password");
            return View();
        }

        private string GetRedirectUrl(string returnUrl)
        {
            if (string.IsNullOrEmpty(returnUrl) || !Url.IsLocalUrl(returnUrl))
            {
                return Url.Action("index", "home");
            }

            return returnUrl;
        }

        public ActionResult LogOut()
        {
            var ctx = Request.GetOwinContext();
            var authManager = ctx.Authentication;

            authManager.SignOut("ApplicationCookie");
            return RedirectToAction("index", "home");
        }
    }
  

Вид

     <div class="col-md-4" style="margin-top:200px;">
        @using (Html.BeginForm("LogInModel", "LogIn", FormMethod.Post, new { @class="form-horizontal" }))
        {
            <div class="form-group">
                <label class="label label-default">Email Address</label>
                <div class="form-control">
                    @Html.TextBoxFor(m => m.Email, new { @class = "form-control"})
                </div>
            </div>

            <div class="form-group">
                <label class="label label-default">Password</label>
                <div class="form-control">
                    @Html.TextBoxFor(m => m.Password, new { @class = "form-control" })
                </div>
            </div>

            @Html.HiddenFor(m => m.ReturnUrl)

            <button class="btn btn-default" type="submit">Log In</button>
        }
    </div>
  

Ответ №1:

Вы не используете Html.BeginForm правильно.

Вместо:

 Html.BeginForm("LogInModel", "LogIn", FormMethod.Post, new {})
  

Это должно быть:

 Html.BeginForm("LogIn", "Auth", FormMethod.Post, new {})
  

Правильное использование:

 Html.BeginForm("actionName", "controllerName", FormMethod.Post, new {})
  

Комментарии:

1. Спасибо. У меня это работает. Но у меня есть вопрос. Не является ли имя моего контроллера AuthController и не Auth ? Немного запутался в том, как это работает.

2. Да, это так, но это asp.net соглашение об именовании по умолчанию в mvc. Он ControllerFactory автоматически добавляется Controller в конце. Вы можете, конечно, переопределить поведение по умолчанию.