/*对比*/

Cookie 和JWT 并存同一项目代码记录

Cookie管理后台管理,JWT对外提供接口验证

具体官方文档链接 使用 ASP.NET Core 中的特定方案授权

实现思路:

             1.添加两种授权方式配置, AddAuthentication 的参数 defaultScheme  使用默认值,不进行赋值

             2.对鉴权如有自定义策略,需要指定 AuthenticationSchemes 

             3.action的鉴权特性需要指明 AuthenticationSchemes 

大体代码如下

 services.AddAuthentication().AddCookie(option =>
            {

                option.Cookie.HttpOnly = true;

                option.LoginPath = new PathString("/Login/Index");
                option.AccessDeniedPath = new PathString("/Login/Privacy");//无权限跳转地址

            }).AddJwtBearer(option =>
            {
                option.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = false,//验证颁发者
                    ValidateAudience = false,//是否验证Audience
                    ValidateLifetime = true,//是否验证失效时间
                    ValidateIssuerSigningKey = true,//是否验证SecurityKey
                   // ValidAudience = "https://localhost:5001/",//
                   // ValidIssuer = "https://localhost:5001/",//Issuer,这两项和前面签发jwt的设置一致
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("12345678901qaz2wsx")),//拿到SecurityKey

                };
            });
 services.AddAuthorization(option =>
            {             
                
                //自定义策略
                option.AddPolicy("CustomPolicy", policy =>
                {
                    policy.AuthenticationSchemes.Add(CookieAuthenticationDefaults.AuthenticationScheme);
                 
                    var customRequirement = new CustomRequirement()
                    {
                        PowerList = new List<RoleMenu>()
                    };
                    //此处需要从数据库获取权限集合,并注入单例,这样就可以在权限修改后对此单例直接修改权限集合
                    //测试数据
                    customRequirement.PowerList.Add(
                        new RoleMenu()
                        {
                            RoleId = "ceshi",
                            Url = "/home/Index"
                        }
                        );
                    policy.Requirements.Add(customRequirement);
                });
            });

鉴权action

 /// <summary>
        /// Cookie 校验
        /// </summary>
        /// <returns></returns>

        [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
        public IActionResult Index2()
        {
            Console.WriteLine(User.Claims.FirstOrDefault(t => t.Type == "time").Value);
            return View();
        }
        /// <summary>
        /// JWT 校验
        /// </summary>
        /// <returns></returns>
        [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
        public IActionResult Index3()
        {
            Console.WriteLine(User.Claims.FirstOrDefault(t => t.Type == "time").Value);
            return Ok(User.Claims.FirstOrDefault(t=>t.Type== "time").Value);
        }

 

JWT Claims

iss 【issuer】发布者的url地址

sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段

aud 【audience】接受者的url地址

exp 【expiration】 该jwt销毁的时间;unix时间戳

nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳

iat 【issued at】 该jwt的发布时间;unix 时间戳

jti 【JWT ID】 该jwt的唯一ID编号

posted @ 2020-12-08 14:44  蔡风剑  阅读(267)  评论(0编辑  收藏  举报