簡體   English   中英

允許用戶訪問[授權]頁面-MVC

[英]Allow user to visit [Authorize] pages - MVC

我的項目的頁面帶有[Authorize] ,用戶必須登錄才能訪問這些頁面。

使用與數據庫中相同的用戶名和密碼成功登錄后,當前用戶ID將存儲在會話中。 但是,我該如何驗證/允許用戶使用[授權]訪問頁面?

[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自己管理登錄名和安全性,則可以創建自己的操作過濾器,以檢查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
{
}

如果要控制用戶可以執行的操作,則應該具有自己的角色管理。 每個用戶應具有一個或多個角色,每個角色可以具有一組權限,並且您可以創建一個從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
    {
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM