XiaoQi.Study项目(二)

一、EF Core 使用的补充

  1) 创建 接口 IEFCoreService

  2)   实现 接口 EFCoreService

  3) 在Startup.cs 中注册 ef 服务 并在控制器中注入使用 (这种方式不规范,只是对其基本使用的一些操作)

  注册服务代码

  services.AddScoped<IEFCoreService, EFCoreService>();

二、创建鉴权用到的类

//存放文件夹
AuthHelper
//api 返回处理器
ApiResponseHandler
//api 返回类型
ApiResponseType

//jwt 授权处理器
JwtAuthorizationHandler          这个类需要在Startup.cs 注册以下内容            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//jwt 授权认证资源
JwtAuthorizationRequirement
//颁发 token 解析 token
JwtHelper
// 生成token 需要的实体 用户id 和角色
JwtTokenModel
// 用户角色 和 其拥有的url 资源
JwtUserRoleInfo

二、配置策略授权

     // 授权验证的资源
            var jwtKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("xiaoqiyaozouxiaoqiyaozouxiaoqiyaozou"));//加密验证的key         
            var jwtCreds = new SigningCredentials(jwtKey, SecurityAlgorithms.HmacSha256); //根据key' 生成的标识
            var jwtUserRoleInofs = new List<JwtUserRoleInfo>();//用户角色和用户拥有的api 集合 ,该角色只能访问其拥有的api         
            var jwtRequirement = new JwtAuthorizationRequirement(
                jwtUserRoleInofs,
                "",
                ClaimTypes.Role,
                expiration: TimeSpan.FromSeconds(60 * 60),
                "",
                "Issuer",
                "Audience",
                jwtCreds
                );
            //注册策略授权
            services.AddAuthorization(o =>
            {
                o.AddPolicy("MyPolicy", policy => policy.Requirements.Add(jwtRequirement));
            })
       services.AddSingleton(jwtRequirement);//将该资源注册,可以在验证处理器种设置其值

三、配置验证异常处理器以及权限验证处理器

         //验证参数设置
            var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = jwtKey,
                ValidateIssuer = true,
                ValidIssuer = "Issuer",//发行人
                ValidateAudience = true,
                ValidAudience = "Audience",//订阅人
                ValidateLifetime = true,
                ClockSkew = TimeSpan.FromSeconds(30),
                RequireExpirationTime = true,
            };

            // 开启Bearer认证
            services.AddAuthentication(o => {
                o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme = nameof(ApiResponseHandler);
                o.DefaultForbidScheme = nameof(ApiResponseHandler);
            })
             // 添加JwtBearer服务
             .AddJwtBearer(o =>
             {
                 o.TokenValidationParameters = tokenValidationParameters;
                 o.Events = new JwtBearerEvents
                 {
                     OnAuthenticationFailed = context =>
                     {
                         // 如果过期,则把<是否过期>添加到,返回头信息中
                         if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                         {
                             context.Response.Headers.Add("Token-Expired", "true");
                         }
                         return Task.CompletedTask;
                     }
                 };
             })
             .AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });

            // 注入权限处理器
            services.AddScoped<IAuthorizationHandler, JwtAuthorizationHandler>();

四、jwt 验证的个人理解图

  

 

  

猜你喜欢

转载自www.cnblogs.com/xiaoqiyaozou/p/12484121.html