mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-07 01:23:27 +08:00
【新增】弃用现在sku前端,启用全新sku组件,更加灵活,体验更好。 【新增】新增通过商品序列获取sku全新列表功能。 【新增】仓储层底层增加二级缓存功能,后面将逐步完善底层缓存中心模块。 【新增】0元购,积分兑换模式下,也去计算用户是否科技升级。 【新增】数据及业务仓储增加二级缓存功能。curd可自主控制是否缓存和清除。 【新增】订单导出excel数据增加商品名称+货品sku组合展示的方式。 【新增】自定义交易组件增加【获取商家信息】【更新商家信息】两个接口处理。 【新增】增加公告列表及公告详情页面,首页组件公告点击跳转列表展示。 【新增】个人中心增加【公告中心】入口。 【新增】后台余额变动增加说明录入。 【调整】将前端能进行分包的文件夹都进行分包,减少主包占用,方便进行二开。 【调整】因ckeditor5存在图片不可设置宽度,上传不支持mp4,排版不畅等情况,降级使用ckeditor4版本。 【修复】修复0.5.5版本售后积分返还机制积分模式判断异常的问题。 【修复】修复使用积分全额抵扣,或其他优惠政策导致的0元购,未进行短信提醒及小票打印机未打印的问题。 【修复】修复更换ckeditor4编辑器后接龙添加编辑调用失败的问题。 【修复】修复积分全额抵扣,金额0元购的情况下,进行售后执行完毕,订单未完结的情况。 【优化】去除分销申请面板按钮无用并失效报错的customStyle属性。 【优化】优化部分方法中使用手写字符串的遗留问题,统一采用enum方式。 【优化】优化前端及接口部分命名错误的问题。错将skill误写成seckill。 【优化】去除uniapp端多个客服代码。 【优化】商品详情底部完善购物车数量显示的问题。 【优化】优化团购列表,拼团列表,秒杀页面页面样式布局差异问题。 【优化】调整支付结果界面样式效果,仿微信支付结果界面。更加清晰明朗。 【优化】优化售后提交页面json计算,开放当用户下单后但未发货情况下,可以申请直接售后的操作需求。 【优化】后台商家手机号码支持设置多个,使用小写逗号分隔,方便多个商家管理员接收下单提醒。 【优化】后台售后单审核,调整售后商品为必选项。
247 lines
11 KiB
C#
247 lines
11 KiB
C#
/***********************************************************************
|
||
* Project: CoreCms
|
||
* ProjectName: 核心内容管理系统
|
||
* Web: https://www.corecms.net
|
||
* Author: 大灰灰
|
||
* Email: jianweie@163.com
|
||
* CreateTime: 2021/1/31 21:45:10
|
||
* Description: 暂无
|
||
***********************************************************************/
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IdentityModel.Tokens.Jwt;
|
||
using System.Linq;
|
||
using System.Security.Claims;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using CoreCms.Net.Auth.Policys;
|
||
using CoreCms.Net.Configuration;
|
||
using CoreCms.Net.Utility.Extensions;
|
||
using Microsoft.AspNetCore.Authentication;
|
||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using Microsoft.IdentityModel.Tokens;
|
||
|
||
namespace CoreCms.Net.Auth
|
||
{
|
||
/// <summary>
|
||
/// Db 启动服务
|
||
/// </summary>
|
||
public static class AuthorizationSetup
|
||
{
|
||
/// <summary>
|
||
/// 后台管理员jwt初始化设置
|
||
/// </summary>
|
||
/// <param name="services"></param>
|
||
public static void AddAuthorizationSetupForAdmin(this IServiceCollection services)
|
||
{
|
||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||
|
||
#region 参数
|
||
//读取配置文件
|
||
var symmetricKeyAsBase64 = AppSettingsConstVars.JwtConfigSecretKey;
|
||
var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
|
||
var signingKey = new SymmetricSecurityKey(keyByteArray);
|
||
var issuer = AppSettingsConstVars.JwtConfigIssuer;
|
||
var audience = AppSettingsConstVars.JwtConfigAudience;
|
||
|
||
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
|
||
|
||
// 如果要数据库动态绑定,这里先留个空,后边处理器里动态赋值
|
||
var permission = new List<PermissionItem>();
|
||
|
||
// 角色与接口的权限要求参数
|
||
var permissionRequirement = new PermissionRequirement(
|
||
"/api/denied",// 拒绝授权的跳转地址(目前无用)
|
||
permission,
|
||
ClaimTypes.Role,//基于角色的授权
|
||
issuer,//发行人
|
||
audience,//听众
|
||
signingCredentials,//签名凭据
|
||
expiration: TimeSpan.FromSeconds(60 * 60 * 24)//接口的过期时间
|
||
);
|
||
#endregion
|
||
|
||
// 复杂的策略授权
|
||
services.AddAuthorization(options =>
|
||
{
|
||
options.AddPolicy(Permissions.Name,
|
||
policy => policy.Requirements.Add(permissionRequirement));
|
||
});
|
||
|
||
|
||
// 令牌验证参数
|
||
var tokenValidationParameters = new TokenValidationParameters
|
||
{
|
||
ValidateIssuerSigningKey = true, //是否验证SecurityKey
|
||
IssuerSigningKey = signingKey, //拿到SecurityKey
|
||
ValidateIssuer = true, //是否验证Issuer
|
||
ValidIssuer = issuer,//发行人 //Issuer,这两项和前面签发jwt的设置一致
|
||
ValidateAudience = true, //是否验证Audience
|
||
ValidAudience = audience,//订阅人
|
||
ValidateLifetime = true,//是否验证失效时间
|
||
ClockSkew = TimeSpan.FromSeconds(4),
|
||
RequireExpirationTime = true,
|
||
};
|
||
|
||
// core自带官方JWT认证,开启Bearer认证
|
||
services.AddAuthentication(o =>
|
||
{
|
||
o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
|
||
o.DefaultChallengeScheme = nameof(ApiResponseForAdminHandler);
|
||
o.DefaultForbidScheme = nameof(ApiResponseForAdminHandler);
|
||
})
|
||
// 添加JwtBearer服务
|
||
.AddJwtBearer(o =>
|
||
{
|
||
o.TokenValidationParameters = tokenValidationParameters;
|
||
o.Events = new JwtBearerEvents
|
||
{
|
||
OnChallenge = context =>
|
||
{
|
||
context.Response.Headers.Add("Token-Error", context.ErrorDescription);
|
||
return Task.CompletedTask;
|
||
},
|
||
OnAuthenticationFailed = context =>
|
||
{
|
||
var token = context.Request.Headers["Authorization"].ObjectToString().Replace("Bearer ", "");
|
||
var jwtToken = (new JwtSecurityTokenHandler()).ReadJwtToken(token);
|
||
|
||
if (jwtToken.Issuer != issuer)
|
||
{
|
||
context.Response.Headers.Add("Token-Error-Iss", "issuer is wrong!");
|
||
}
|
||
|
||
if (jwtToken.Audiences.FirstOrDefault() != audience)
|
||
{
|
||
context.Response.Headers.Add("Token-Error-Aud", "Audience is wrong!");
|
||
}
|
||
|
||
// 如果过期,则把<是否过期>添加到,返回头信息中
|
||
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
|
||
{
|
||
context.Response.Headers.Add("Token-Expired", "true");
|
||
}
|
||
return Task.CompletedTask;
|
||
}
|
||
};
|
||
})
|
||
.AddScheme<AuthenticationSchemeOptions, ApiResponseForAdminHandler>(nameof(ApiResponseForAdminHandler), o => { });
|
||
|
||
|
||
// 注入权限处理器
|
||
services.AddScoped<IAuthorizationHandler, PermissionForAdminHandler>();
|
||
services.AddSingleton(permissionRequirement);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 前端客户jwt初始化设置
|
||
/// </summary>
|
||
/// <param name="services"></param>
|
||
public static void AddAuthorizationSetupForClient(this IServiceCollection services)
|
||
{
|
||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||
|
||
#region 参数
|
||
//读取配置文件
|
||
var symmetricKeyAsBase64 = AppSettingsConstVars.JwtConfigSecretKey;
|
||
var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
|
||
var signingKey = new SymmetricSecurityKey(keyByteArray);
|
||
var issuer = AppSettingsConstVars.JwtConfigIssuer;
|
||
var audience = AppSettingsConstVars.JwtConfigAudience;
|
||
|
||
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
|
||
|
||
// 如果要数据库动态绑定,这里先留个空,后边处理器里动态赋值
|
||
var permission = new List<PermissionItem>();
|
||
|
||
// 角色与接口的权限要求参数
|
||
var permissionRequirement = new PermissionRequirement(
|
||
"/api/denied",// 拒绝授权的跳转地址(目前无用)
|
||
permission,
|
||
ClaimTypes.Role,//基于角色的授权
|
||
issuer,//发行人
|
||
audience,//听众
|
||
signingCredentials,//签名凭据
|
||
expiration: TimeSpan.FromSeconds(60 * 60 * 24 * 30)//接口的过期时间
|
||
);
|
||
#endregion
|
||
|
||
// 复杂的策略授权
|
||
services.AddAuthorization(options =>
|
||
{
|
||
options.AddPolicy(Permissions.Name, policy => policy.Requirements.Add(permissionRequirement));
|
||
});
|
||
|
||
|
||
// 令牌验证参数
|
||
var tokenValidationParameters = new TokenValidationParameters
|
||
{
|
||
ValidateIssuerSigningKey = true, //是否验证SecurityKey
|
||
IssuerSigningKey = signingKey, //拿到SecurityKey
|
||
ValidateIssuer = true, //是否验证Issuer
|
||
ValidIssuer = issuer,//发行人
|
||
ValidateAudience = true, //是否验证Audience
|
||
ValidAudience = audience,//订阅人
|
||
ValidateLifetime = true, //是否验证失效时间
|
||
ClockSkew = TimeSpan.FromSeconds(4),
|
||
RequireExpirationTime = true,
|
||
};
|
||
|
||
// core自带官方JWT认证,开启Bearer认证
|
||
services.AddAuthentication(o =>
|
||
{
|
||
o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
|
||
o.DefaultChallengeScheme = nameof(ApiResponseForClientHandler);
|
||
o.DefaultForbidScheme = nameof(ApiResponseForClientHandler);
|
||
})
|
||
// 添加JwtBearer服务
|
||
.AddJwtBearer(o =>
|
||
{
|
||
o.TokenValidationParameters = tokenValidationParameters;
|
||
o.Events = new JwtBearerEvents
|
||
{
|
||
OnChallenge = context =>
|
||
{
|
||
context.Response.Headers.Add("Token-Error", context.ErrorDescription);
|
||
return Task.CompletedTask;
|
||
},
|
||
OnAuthenticationFailed = context =>
|
||
{
|
||
var token = context.Request.Headers["Authorization"].ObjectToString().Replace("Bearer ", "");
|
||
var jwtToken = (new JwtSecurityTokenHandler()).ReadJwtToken(token);
|
||
|
||
if (jwtToken.Issuer != issuer)
|
||
{
|
||
context.Response.Headers.Add("Token-Error-Iss", "issuer is wrong!");
|
||
}
|
||
|
||
if (jwtToken.Audiences.FirstOrDefault() != audience)
|
||
{
|
||
context.Response.Headers.Add("Token-Error-Aud", "Audience is wrong!");
|
||
}
|
||
|
||
// 如果过期,则把<是否过期>添加到,返回头信息中
|
||
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
|
||
{
|
||
context.Response.Headers.Add("Token-Expired", "true");
|
||
}
|
||
return Task.CompletedTask;
|
||
}
|
||
};
|
||
})
|
||
.AddScheme<AuthenticationSchemeOptions, ApiResponseForClientHandler>(nameof(ApiResponseForClientHandler), o => { });
|
||
|
||
|
||
// 注入权限处理器
|
||
services.AddScoped<IAuthorizationHandler, PermissionForClientHandler>();
|
||
services.AddSingleton(permissionRequirement);
|
||
}
|
||
|
||
|
||
}
|
||
}
|