Перенаправление не включает имя приложения и аутентификация не работает должным образом - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать учетную запись «Администратор», чтобы мои пользователи могли добавлять контент самостоятельно, и мне не нужно беспокоиться о незнакомце, который каким-то образом перенаправит на действие «Создать / Редактировать / Удалить».Я помещаю имя пользователя и пароль для аутентификации в файле Web.config, и все отлично работает в Visual Studio.Но когда я публикую приложение в IIS, аутентификация кажется неудачной, и при перенаправлении обратно к действию Login я получаю 404 Not Found Error.Если при перенаправлении или возврате View маршрут не включает имя приложения {application name}/Authentication/Login, вместо этого просто возвращается Authentication/Login, но когда я пытаюсь посетить одно из действий Create, оно успешно перенаправляется, это сводит меня с ума, и любая помощьочень ценится.

RouteConfig.cs

routes.MapRoute(
                name: "Authentication",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Authentication", action = "Login", id = UrlParameter.Optional }
            );

AuthenticationController.cs

namespace ShipleySwine.Controllers
{
    public class AuthenticationController : Controller
    {
        // GET: Authentication
        public ActionResult Login()
        {
            ViewBag.Message = TempData["Message"];
            return View();
        }

        [HttpPost]
        public ActionResult Login(AuthenticationViewModel vm)
        {
            //if (ModelState.IsValid)
            //{
            //    if (vm.user.userName == System.Configuration.ConfigurationManager.AppSettings["Admin"].ToString() && vm.user.password == System.Configuration.ConfigurationManager.AppSettings["adminPass"].ToString())
            //    {
            //        Session["Authentication"] = "Success";
            //        return RedirectToAction("Index", "Admin");
            //    }
            //    else
            //    {
            //        TempData["Message"] = "Login failed, Incorrect username/password";
            //        return Redirect("/ShipleySwine/Authentication/Login");
            //        //return RedirectToAction("Login", "Authentication");
            //    }
            //}
            //else
            //{
            //    //return RedirectToAction("Login", "Authentication");
            //    return Redirect("/ShipleySwine/Authentication/Login");
            //}

            if (ModelState.IsValid)
            {
                if (vm.user.userName == System.Configuration.ConfigurationManager.AppSettings["Admin"].ToString() && vm.user.password == System.Configuration.ConfigurationManager.AppSettings["adminPass"].ToString())
                {
                    Session["Authentication"] = "Success";
                    return RedirectToAction("Index", "Admin");
                }
                else
                {
                    TempData["Message"] = "Login failed, Incorrect username/password";
                    ViewBag.Message = "Login failed, Incorrect username/password";
                    return View();
                }
            }
            else
            {
                return View();
            }
        }
    }
}

Login.cshtml

@model ShipleySwine.ViewModels.AuthenticationViewModel
@{
    ViewBag.Title = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";

}

<div class="row">
    <div class="col-4">
    </div>
    <div style="padding: 50px; margin-top: 25px;" class="col-4 backgroundcolor rounded">
        <h2 class="text-center">Login</h2>
        <form action="/Authentication/Login" method="post">
            <div class="form-group">
                <label for="exampleInputEmail1">Username</label>
                <input name="user.userName" type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter Username">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">Password</label>
                <input name="user.password" type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
            </div>
            @if (ViewBag.Message != null)
            {
                <p class="text-danger font-weight-bold">@ViewBag.Message</p>
            }
            <div class="text-center">
                <button type="submit" class="btn btn-primary">Submit</button>
            </div>
        </form>
    </div>
    <div class="col-4">

    </div>
</div>


Web.config

<appSettings>
    <add key="Admin" value="{username}"/>
    <add key ="adminPass" value="{password}"/>
</appSettings>

Создать действие с успешным перенаправлением

public ActionResult Create()
        {
            if(Session["Authentication"] != null)
            {
                if(Session["Authentication"].ToString() != "Success")
                {
                    return RedirectToAction("Login", "Authentication");
                }
                else
                {
                    ViewBag.BoarId = db.Boars.Max(boarid => boarid.Boar_Id) + 1;
                    return View();
                }
            }
            else
            {
                return RedirectToAction("Login", "Authentication");
            }

        }

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Просто измените свою форму на это:

<form action="@Url.Action("Login")" method="post">
0 голосов
/ 21 сентября 2019

Очевидно, я не дал себе достаточно времени ...

Разобрался, внимательно присмотревшись.Я жестко закодировал действие в Login.cshtml

<form action="/Authentication/Login" method="post">

. Это прекрасно работает в Visual Studio, работающей на Localhost, но при публикации в IIS маршрут не существует.В действительности это не было перенаправление, потому что форма не была успешно передана в контроллер

Исправлено Login.cshtml

<div class="row">
    <div class="col-4">
    </div>
    <div style="padding: 50px; margin-top: 25px;" class="col-4 backgroundcolor rounded">
        <h2 class="text-center">Login</h2>
        @using (@Html.BeginForm("Login", "Authentication", FormMethod.Post))
        {

            <div class="form-group">
                <label for="exampleInputEmail1">Username</label>
                <input name="user.userName" type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter Username">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">Password</label>
                <input name="user.password" type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
            </div>
            if (ViewBag.Message != null)
            {
                <p class="text-danger font-weight-bold">@ViewBag.Message</p>
            }
            <div class="text-center">
                <button type="submit" class="btn btn-primary">Submit</button>
            </div>

        }
    </div>

с важным изменением - помощником тега @using (@Html.BeginForm("Login", "Authentication", FormMethod.Post))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...