NetCore之身份验证Authentication

身份验证(Authentication)是确定用户身份的过程授权(Authentication)是确定用户是否有权访问资源的过程
授权是指确定用户可执行的操作的过程。 例如,允许管理用户创建文档库、添加文档、编辑文档和删除文档。 使用库的非管理用户仅获得读取文档的权限。

授权与身份验证相互独立。
但是,授权需要一种身份验证机制。 身份验证是认定用户的过程。 身份验证可为当前用户创建一个或多个标识。

1:基本授权

首先先在Configure中添加鉴权的中间件

//使用鉴权(身份验证)是指验证用户是否拥有访问系统的权利
app.UseAuthentication();

在ConfigureServices中注入服务

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddRazorPages();
            //Cookies
            services.AddAuthentication(defaultScheme: "Cookies")
                .AddCookie(option =>
                {
                    option.LoginPath = new Microsoft.AspNetCore.Http.PathString(value: "/Authorization/Index");
                });
        }

/Authorization/Index  

 public class AuthorizationController : Controller
    {

        public AuthorizationController()
        {         
        }
        // GET: Authorization
        public ActionResult Index(string Role)
        {
            //Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息,
            //然后Claim组成一个ClaimIdentity 就是组成一个身份证
            var claim = new List<Claim>
            {
                new Claim(ClaimTypes.Name,value:"张三"),
                new Claim(type:"Address",value:"北京市"),
                new Claim(ClaimTypes.Role,Role)
            };

            var identity = new ClaimsIdentity(claim,authenticationType:"ZSIdentity");
            HttpContext.SignInAsync(principal:new ClaimsPrincipal(identity));
            return View();
        }
    }

如果不在HomeController上面不加Authorize,我们是可以正常浏览Home/Index
如果在HomeController上面加Authorize,我们是不可以正常浏览Home/Index,
会报错,然后页面跳转到/Authorization/Index
先去/Authorization/Index 做授权

我们先/Authorization/Index授权成功,再去浏览Home/Index就是ok的
同时我们F12,去看浏览器的Application就会有Cookies值

    [Authorize]
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }
    }

 2:角色授权

/Authorization/Index 中的内容不变,变的是HomeController中的方法 

 [Authorize]
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }
        //SVIP这个页面,Roles为SVIP的可以访问
        [Authorize(Roles = "SVIP")]
        public string SVIP()
        {
            return "SVIP";
        }
        //VIP这个页面,Roles为SVIP,VIP的可以访问
        [Authorize(Roles = "SVIP,VIP")]
        public string VIP()
        {
            return "VIP";
        }
        //NoVIP这个页面,Roles为SVIP,VIP,NoVIP 的可以访问
        [Authorize(Roles = "SVIP,VIP,NoVIP")]
        public string NoVIP()
        {
            return "NoVIP";
        }
    }
//Roles的值是从new Claim(ClaimTypes.Role,Role) 这里传入进来的

3:策略认证(角色认证的Plus版本)

先去ConfigureServices中注入

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddRazorPages();
            //Cookies
            services.AddAuthentication(defaultScheme: "Cookies")
                .AddCookie(option =>
                {
                    option.LoginPath = new Microsoft.AspNetCore.Http.PathString(value: "/Authorization/Index");
                });

            #region 策略
            services.AddAuthorization(configure =>
            {
                //SVIP是策略的名字
                configure.AddPolicy(name: "SVIP",
                    option =>
                     {
                         //SVIP是角色                    
                         option.RequireRole(roles: "SVIP");//用户的角色必须是SVIP,才能访问SVIP Page
                         //option.RequireRole(roles: "admin");这个意思是传过来的策略的值必须是SVIP和Admin
                     }
                     );
                configure.AddPolicy(name: "VIP",
                     option =>
                     {
                         //就是角色"SVIP", "VIP" 都可以访问策略为VIP Page
                         option.RequireRole("VIP","SVIP");
                      });
                configure.AddPolicy(name: "NoVIP",
                    option =>
                    {
                        //就是角色"NoVIP", "VIP" 都可以访问策略为NoVIP Page
                        option.RequireRole("NoVIP", "VIP", "SVIP");
                    });
            });
            #endregion
        }

然后更改下授权页的方式

[Authorize]
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }
        
        [Authorize(Policy = "SVIP")]
        public string SVIP()
        {
            return "SVIP";
        }
        [Authorize(Policy = "VIP")]
        public string VIP()
        {
            return "VIP";
        }
        [Authorize(Policy = "NoVIP")]
        public string NoVIP()
        {
            return "NoVIP";
        }
    }
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
原文地址:https://www.cnblogs.com/ZkbFighting/p/14708743.html