允许用户访问[授权]页面 - MVC

时间:2016-09-26 01:18:19

标签: c# asp.net-mvc entity-framework

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

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

[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);
    }

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

2 个答案:

答案 0 :(得分:4)

如果您绝对想要使用Session自己管理登录和安全性,您可以创建自己的操作过滤器,检查会话是否设置了用户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);
    }
}

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

[AuthorizeWithSession]
public class TeamController : Controller
{
}

答案 1 :(得分:1)

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

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

例如:

 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
    {
    }