В моем приложении
у меня обычно 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 (не ядро). Спасибо заранее.