2016-09-26 182 views
1

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

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

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

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

回答

3

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

像这样的事情

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

啊感谢,但我应该在哪里把这个类在MVC?我很新,所有这些排序仍然令人困惑。 – skylake

+0

TryGetValue有问题,因为我得到以下错误 - ..'由于其保护级别而无法访问。无法解析符号TryGetValue'.'不知道如何解决这个问题。 – skylake

+1

啊!该代码是针对aspnet核心的。对于其他版本的MVC,您可以对该密钥执行空值检查(答案已更新)。你可以把这个班放在你的项目的任何地方。我更喜欢创建一个名为“Filters”的目录并将所有过滤器放在该过滤器下。 – Shyju

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

感谢您的启发。 'RoleEnum []'不能解决,我该如何处理? – skylake

+1

RoleEnum []只是一个包含您的角色列表的枚举,例如:Customer,Administrator,User。 ' 公共枚举RoleEnum { 管理员, 客户 } –

相关问题