авторизация входа в систему в mvc5 - PullRequest
0 голосов
/ 17 апреля 2020
В моем приложении

у меня обычно 3 пользователя (администратор, клиент и водитель), и на странице по умолчанию я хочу добавить несколько новых панелей навигации, например, которые будут доступны только указанному пользователю c. и когда я делаю это, я получаю эти панели навигации, не пытаясь аутентифицировать пользователя (это появляется на странице по умолчанию сразу после запуска приложения). вот мое действие по входу в систему по умолчанию в моем контроллере:

       [HttpGet]
        public ActionResult Login(LoginModel login)
        {
            HttpCookie cookie = Request.Cookies["Login"];
            if (cookie != null)
            {
                login.UserName = cookie.Values[0];
                login.Password = cookie.Values[1];
            }

            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginModel login, string returnUrl)
        {

            if (ModelState.IsValid)
            {
                var userManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
                var authManager = HttpContext.GetOwinContext().Authentication;
                IdentityUser user = await userManager.FindAsync(login.UserName, login.Password);
                if (user != null)
                {
                    var ident = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
                    authManager.SignIn(new AuthenticationProperties { IsPersistent = false }, ident);
                    //I have 3 roles in my app
                    if (userManager.IsInRole(user.Id, "Customer"))
                    {
                        return Redirect(returnUrl ?? Url.Action("Index", "Riders"));
                    }
                    else if (userManager.IsInRole(user.Id, "Driver"))
                    {
                        return Redirect(returnUrl ?? Url.Action("Index", "Drivers"));
                    }
                    else if (userManager.IsInRole(user.Id, "Admin"))
                    {
                        return Redirect(returnUrl ?? Url.Action("Index", "Admin"));
                    }
                    ViewBag.Message = string.Format("User {0} Login Successfully", user.UserName);
                }
            }
            //if remember me was checked 
            if (login.RememberMe == true)
            {

                Response.Cookies["Login"]["UserName"] = login.UserName;
                Response.Cookies["Login"]["Password"] = login.Password;
                Response.Cookies["Login"].Expires = DateTime.Now.AddYears(1);
            }
            ModelState.AddModelError("", "Invalid username or password");
            return View(login);
}

, и моя общая папка содержит: частичное представление администратора + частичное представление входа в систему и некоторые другие общие представления. У меня также есть представление входа в папку по умолчанию. это мое частичное представление администратора:

@using Microsoft.AspNet.Identity;
@using Microsoft.AspNet.Identity.EntityFramework;
@using Microsoft.Owin.Security;
@using Microsoft.Owin.Security.OAuth;
@using RidesApp.Models



@if (Request.IsAuthenticated)
{
    RidesDbContext context = new RidesDbContext();
    UserStore<IdentityUser> userStore = new UserStore<IdentityUser>(context);
    UserManager<IdentityUser, string> userManager = new UserManager<IdentityUser, string>(userStore);


    bool exist = userManager.IsInRole(User.Identity.GetUserId(), "Admin");

    if (exist)
    {
        <ul class="navbar-nav ">    
            <li class="nav-item">
                @Html.ActionLink("Admin page", "Index", "Admin", new { @class = "nav-link" })
            </li>
        </ul>
    }

}

в частичном представлении входа в систему. Я хочу изменить ссылку входа в систему на выход из системы после входа пользователя, но это также не работает:

@using Microsoft.AspNet.Identity.EntityFramework;
@using Microsoft.AspNet.Identity.Owin;
@using Microsoft.Owin.Logging;
@using Microsoft.AspNet.Identity;
@using System.Web.Security;




@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("LogOut", "Default", FormMethod.Post, new { id = "logoutForm" }))
    {
        @Html.AntiForgeryToken()

       <ul class="navbar-nav">
           <li>
               <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                   My Account
               </a>
           </li>

       </ul>

    }
}
else
{
    <ul class="navbar-nav ml-auto">
        <li class="nav-item ">
            @Html.ActionLink("Sign Up", "AddUser", "Admin", routeValues: null, htmlAttributes: new { id = ""})
            <i class="fa fa-user"></i>
        </li>

        <li class="nav-item">
            @Html.ActionLink("Login", "Login", "Default", routeValues: null, htmlAttributes: new { id = " " })
            <i class="fa fa-login"></i>
        </li>
    </ul>
}

на главной странице макета У меня есть следующее для создания новых панелей навигации после того, как пользователь вошел в систему:

             @Html.Partial("_LoginPartial")
                @Html.Partial("_AdminPartial")
                <ul class="navbar-nav  ml-auto">
                    <li class="nav-item">
                        @Html.ActionLink("my profile", "Index", "Riders")
                    </li>
                </ul>

            </div>
        </div>

    </nav>


    <div>
        @RenderBody()
    </div>



</body>
</html>

Однако я вижу все панели навигации даже без входа в систему.

Наконец мое действие по выходу из системы выглядит следующим образом:

[Authorize]
        [HttpPost]
        public ActionResult LogOut()
        {
            /*  FormsAuthentication.SignOut();
              Session.Abandon();

              return RedirectToAction("Index");*/
            var authenticationManager = Request.GetOwinContext().Authentication;
            authenticationManager.SignOut();
            ViewBag.Message = "Logout Successfully";
            return RedirectToAction("Login");
        }

Я что-то упустил? Буду признателен за вашу помощь. Я использую Entity Framework (не ядро). Спасибо заранее.

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