• ASP.NET MVC 中如何实现基于角色的权限控制


    在ASP.NET MVC中,通过使用其所提供的内置

    [Authorize]
    public ActionResult Index()

    标记的方式,可以实现所标记的ACTION必须是认证用户才能访问;

    通过使用

    [Authorize(Users="username")]

    的方式,可以实现所标记的ACTION必须是某个具体的用户才能访问,以上两种方式使用起来非常方便,在NeedDinner示例程序中已有具休的实现过程,

    但是,我们在实际的应用中所使用的大都是基于角色(Roles)的认证方式,NeedDinner中却未给出,本文给出具体实现(基于ASP.NET Forms验证)过程:

    step 1
    在完成UserName和Password认证后,向客户端写入认证Cookie

    代码

            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                1,
                userName,
                DateTime.Now,
                DateTime.Now.AddMinutes(20),
                false,
                "admin"//写入用户角色
                );
           
            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
           
            System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

    step 2
    在Global.asax.cs文件中加入以下代码,用于在用户登陆网站时读取Cookie

    代码
    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie == null || authCookie.Value == "")
            {
                return;
            }
            FormsAuthenticationTicket authTicket = null;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            }
            catch
            {
                return;
            }
            string[] roles = authTicket.UserData.Split(new char[] { ';' });
             if (Context.User != null)
            {
                Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
            }
        }

    step 3

    这样以来,就可以使用实现以下效果

      [Authorize(Roles="admin")]
        public ActionResult Index(int ? page)

  • 相关阅读:
    [软件工程基础]第 1 次个人作业
    [软件工程基础]个人项目 数独
    [2017BUAA软件工程]第0次个人作业
    [2017BUAA软工]第零次作业
    NoSQL-流式数据处理与Spark
    C、JAVA存储管理不同点
    数据库之一窥数据库系统
    Java单元测试-覆盖率分析报告自动生成
    Java单元测试-快速上手Junit(进阶)
    Java单元测试-快速上手Junit
  • 原文地址:https://www.cnblogs.com/oer2001/p/2971168.html
Copyright © 2020-2023  润新知