zoukankan      html  css  js  c++  java
  • 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编号

  • 相关阅读:
    MSI文件的制作
    QPushButton 响应回车 设置默认按钮
    ubuntu 使用apt-fast 安装软件包
    apt命令集使用教程
    如何在windows下使用git及github仓库管理项目
    如何在windows下使用git及github仓库管理项目
    01. struts2介绍
    人生能跨越多少个年代
    联调踩的坑:空和空字符串引发的巨大差异
    我的亲历:一行代码,百万人民币打水漂
  • 原文地址:https://www.cnblogs.com/DDSkay/p/14102558.html
Copyright © 2011-2022 走看看