Identity Core探索之旅(四)

模拟登录登出内部demo

  其实我不太想做这一节,但是如果不做,直接做下一节你们又看不懂,索性在这一节做一个模拟登录登出的demo,那大家跟着我做即可。下面大家打开VS跟我一起动手!


构建demo

  1. 先搭建出一个能运行的asp.net core mvc程序,参考我第一节的步骤1,2。
  2. 在Startup类的ConfigureServices方法里添加代码:
services.AddAuthentication("CookieAuth")
                .AddCookie("CookieAuth", config => {
                    config.Cookie.Name = "Grandpa.cookie";
                    config.LoginPath = "/Home/Index";
                 });
  1. 在HomeController里添加SignIn和SignOut方法:
       public IActionResult SignIn()
       {
           var claims = new Claim[]
           {
               new Claim(ClaimTypes.Name,"Alice"),
               new Claim(ClaimTypes.Role,"user"),
               new Claim(ClaimTypes.Email,"Alice@163.com")
           };

           ClaimsIdentity identity = new ClaimsIdentity(claims,"whatfuck");
           ClaimsPrincipal principal = new ClaimsPrincipal(new[] { identity});
           HttpContext.SignInAsync(principal);
           return RedirectToAction("Index");
       }
       
       public IActionResult SignOut()
       {
           HttpContext.SignOutAsync();
           return RedirectToAction("Index");
       }
  1. 运行程序,在浏览器按下F12,将url指定到Home/SignIn,查看浏览器调试界面中的cookie,发现已经有值了,再将url指定到Home/SignOut,发现cookie被清除。

重点分析

  OK,之前我们都没有讲过startup里的对Authentication的配置,这里讲一下,先看代码:

                services.AddAuthentication("CookieAuth")
                .AddCookie("CookieAuth", config => {
                    config.Cookie.Name = "Grandpa.cookie";
                    config.LoginPath = "/Home/Index";
                 });

  AddAuthentication,顾名思义是添加一个验证方案,其参数string表示的是验证方案的名字,然后AddCookie,输入两个参数,一个是方案名,另一个是配置这个方案的action,我们addcookie就说明我们采用cookie作为验证用户身份的方案。AddCookie方法通过方案名与指定的方案绑定在一起(所以前面的AddAuthentication也不是无用的)。

  然后我们回到HomeController,看到SignIn方法:

           //接下来这整段代码做的事情就是模拟一个用户登录
           //先声明一组claims,表示这个用户拥有的用户信息
            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name,"Alice"),
                new Claim(ClaimTypes.Role,"user"),
                new Claim(ClaimTypes.Email,"Alice@163.com")
            };
           //把这些claims放到一个claimidentity上,并说明这是哪种验证形式
            ClaimsIdentity identity = new ClaimsIdentity(claims,"whatfuck");
            //有了claimidentity我们就可以创建当事人(ClaimsPrincipal)了
            ClaimsPrincipal principal = new ClaimsPrincipal(new[] { identity});
            //最后用这个当事人登录
            HttpContext.SignInAsync(principal);

  实际上,SignInManager的SignIn做的事情跟我们写的这段模拟代码原理应该是一样的。然后这一节就当是复习一下第一节所说的概念吧。下一节,我们来讲policy和authorization。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页