允许用户访问页面 – 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 { }