允许用户访问页面 – MVC

我的项目获得了[Authorize]页面,用户必须登录才能访问这些页面。

使用与数据库中相同的用户标识和密码成功登录后,当前用户标识将存储在会话中。 但是我如何validation/允许用户使用[授权]访问页面?

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Login(User u) { if (ModelState.IsValid) //this is check validity { using (UserEntities db = new UserEntities()) { var v = db.Users.Where(a=>a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault(); if (v != null) { Session["LoggedUserID"] = u.Id.ToString(); Session["UserFullname"] = u.Name.ToString(); return RedirectToAction("AfterLogin"); } } } return View(u); } 

任何帮助都非常感激。 谢谢。

如果您绝对想要使用Session自己管理登录和安全性,则可以创建自己的操作filter,以检查会话是否设置了用户ID。

像这样的东西

 public class AuthorizeWithSession : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (context.HttpContext.Session == null || context.HttpContext.Session["LoggedUserID"]==null) { context.Result = new RedirectToRouteResult(new RouteValueDictionary( new {controller = "Account", action = "Login"})); } base.OnActionExecuting(context); } } 

现在在您的安全操作/控制器上装饰此操作filter

 [AuthorizeWithSession] public class TeamController : Controller { } 

如果要控制用户可以执行的操作,则应该拥有自己的角色管理。 每个用户都应该有一个或多个角色,每个角色都可以拥有一组权限,您可以创建一个从AuthorizeAttributeinheritance的动作filter,以确保尽早执行。

在AuthorizeAttribute的AuthorizeCore方法中,您将看到用户是否经过身份validation,如果他已经过身份validation,那么您可以读取他的身份,从数据库中读取他的角色和权限,并将其与传递给角色的值进行比较。

例如:

  public class RequireRoleAttribute : AuthorizeAttribute { public RoleEnum[] RequiredRoles { get; set; } public RequireRoleAttribute() { } public RequireRoleAttribute(params RoleEnum[] roles) : this() { RequiredRoles = roles; } protected override bool AuthorizeCore(HttpContextBase httpContext) { var principle = httpContext.User; if (principle == null || principle.Identity == null || !principle.Identity.IsAuthenticated) { return false; } if (RequiredRoles != null) { if (!HasRole(RequiredRoles)) { httpContext.Response.Redirect("/AccessDenied"); } } return base.AuthorizeCore(httpContext); } public bool HasRole(RoleEnum[] roles) { foreach (var role in roles) { if (HasRole(role)) return true; } return false; } public bool HasRole(RoleEnum role) { return true if the user role has the role specified (read it from database for example) } } 

然后在您的控制器中,只需使用属性注释控制器或操作

  [RequireRole(RoleEnum.Administator)] public class MySecureController : Controller { }