zoukankan      html  css  js  c++  java
  • 【MVC5】普通权限+用户+角色

      前言: 最新开发项目要求做授权,项目是MVC+Webapi,这里只说MVC里的授权,初步学习授权内容,简单总结一下:

    方法里设置权限示例:

    [Authorize]  //普通授权
    [Authorize(Roles = "admin")]  //角色授权
    [Authorize(Users = "admin")]  //用户授权

    【Main】核心代码1:

    //设置授权方式一(授权模式:通用授权:[Authorize]+用户授权:[Authorize(Users = "admin")]):
    //过期时间在配置节点的timeout
    //FormsAuthentication.SetAuthCookie(loginUser.Name, true);
    
    //设置授权方式二(存储用户数据=角色等,ticket有效期30天)(授权模式为:通用授权+用户授权+角色授权:[Authorize(Roles = "admin")]);
    //这里仅是角色信息存储,具体的角色设置是在Global.aspx.cs的方法Application_AuthenticateRequest中设置new GenericPrincipal(identity, new string[] { role })起的作用;
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddDays(30), true, loginUser.Role);
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
    // 设置cookie的过期时间(这里是1小时)
    cookie.Expires = DateTime.Now.AddHours(1);
    Response.Cookies.Add(cookie);

    【Main】核心代码2:

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        // 取得认证Check的Cookie
        HttpCookie cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    
        if (cookie == null) return;
    
        // 解密
        FormsAuthenticationTicket ticket = null;
        try
        {
            ticket = FormsAuthentication.Decrypt(cookie.Value);
        }
        catch (Exception)
        {
            return;
        }
        if (ticket == null) return;
    
        // 取得ticket.UserData中设定的角色
        string role = ticket.UserData;
    
        // From认证中,使用IPrincipal对象中的GenericPrincipal类。
        // 该类由表示资格情报的FormsIdentity类和角色信息(string[]对象)组成。
        FormsIdentity identity = new FormsIdentity(ticket);
        GenericPrincipal principal = new GenericPrincipal(identity, new string[] { role });
    
        // 把FormsIdentity赋值到Context.User中
        // 可以从Page.User中取得该值
        Context.User = principal;
    }

    以下是原文:转载自:【MVC5】使用权限+角色

    1.在Ticket中设置用户角色

    在权限的Ticket中设置用户的角色(这里是逗号分割)。

    List<string> roles = new List<string>();
    
    if (isAdmin) {
        roles.Add("Admin");
    } 
    roles.Add("Guest");
    
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, 
        model.UserId, 
        DateTime.Now, 
        DateTime.Now.AddDays(30),    // 设置记住登录的时间(这里是30天)
        true,
        String.Join(",", roles));    // 设置用户角色
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
    // 设置cookie的过期时间(这里是50年)
    cookie.Expires = DateTime.Now.AddYears(50);
    Response.Cookies.Add(cookie);

    2.在Global.asax.cs中添加Application_AuthenticateRequest方法

    protected void Application_AuthenticateRequest(object sender, EventArgs e) {
        // 取得认证Check的Cookie
        HttpCookie cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    
        if (cookie == null) return;
    
        // 解密
        FormsAuthenticationTicket ticket = null;
        try {
            ticket = FormsAuthentication.Decrypt(cookie.Value);
        }
        catch (Exception) {
            return;
        }
        if (ticket == null) return;
    
        // 取得ticket.UserData中设定的角色
        string[] roles = ticket.UserData.Split(new char[] { ',' });
    
        // From认证中,使用IPrincipal对象中的GenericPrincipal类。
        // 该类由表示资格情报的FormsIdentity类和角色信息(string[]对象)组成。
        FormsIdentity identity = new FormsIdentity(ticket);
        GenericPrincipal principal = new GenericPrincipal(identity, roles);
    
        // 把FormsIdentity赋值到Context.User中
        // 可以从Page.User中取得该值
        Context.User = principal;
    }

    3.在Controller中使用Authorize特性

    // 允许匿名访问
    [AllowAnonymous]
    public class HomeController : Controller
    {
        ......
    }
    
    // 只允许登录用户访问
    [Authorize]
    public class SampleController : Controller 
    {
        ......
    }
    
    // 只允许具有"Admin"角色的用户访问
    [Authorize(Roles = "Admin")]
    public class SampleController : Controller 
    {
        ......
    }
    
    // 该特性同样可用于Action

    参照:http://www.atmarkit.co.jp/ait/articles/0307/26/news002_2.html

    已同步到【MVC5】ASP.NET MVC 项目笔记汇总

  • 相关阅读:
    一条痛并快乐的路
    Daily Scrum 11.1
    Daily Scrum 10.31
    Daily Scrum 10.30
    Daily Scrum 10.29
    Daily Scrum 10.28
    Daily Scrum 10.27
    (Alpha)Let's-Chronos分数分配规则
    Daily Scrum 10.26
    Daily Scrum 10.25
  • 原文地址:https://www.cnblogs.com/lxhbky/p/13942471.html
Copyright © 2011-2022 走看看