• 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";
            }
        }
    人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
  • 相关阅读:
    实时控制软件设计-读书笔记
    1月9号
    第一组咖啡机器人部分图形设计
    《构建之法:现代软件工程》阅读笔记
    《实时控制软件设计》第三周作业
    实时控制软件设计第二次作业
    《实时控制软件设计》团队项目个人总结
    《实时控制软件设计》团队项目第三天工作日志
    《实时控制软件设计》团队项目第三天工作日志
    《实时控制软件设计》团队项目第二天工作日志
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/14708743.html
Copyright © 2020-2023  润新知