diff --git a/Falcon.SugarApi/ClaimTicket/ClaimTicketModelBinding.cs b/Falcon.SugarApi/ClaimTicket/ClaimTicketModelBinding.cs index b48b8b1..a871021 100644 --- a/Falcon.SugarApi/ClaimTicket/ClaimTicketModelBinding.cs +++ b/Falcon.SugarApi/ClaimTicket/ClaimTicketModelBinding.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.Extensions.Logging; using System.Threading.Tasks; namespace Falcon.SugarApi.ClaimTicket @@ -8,23 +9,31 @@ namespace Falcon.SugarApi.ClaimTicket /// public class ClaimTicketModelBinding:IModelBinder { - /// - /// 票据创建器 - /// - public ITicketBuilder Builter { get; set; } /// /// 配置 /// public ClaimTicketOptions Options { get; set; } + /// + /// 票据创建器 + /// + public ITicketBuilder TicketBuilder { get; } + /// + /// 日志记录 + /// + public ILogger Logger { get; set; } /// /// 通过票据创建器创建模型绑定 /// - /// - /// - public ClaimTicketModelBinding(ITicketBuilder builter,ClaimTicketOptions options) { - Builter = builter; + /// 配置 + /// 票据创建器 + /// + public ClaimTicketModelBinding( + ClaimTicketOptions options, + ITicketBuilder ticketBuilder,ILogger logger) { this.Options = options; + TicketBuilder = ticketBuilder; + this.Logger = logger; } Task IModelBinder.BindModelAsync(ModelBindingContext bindingContext) { @@ -35,7 +44,14 @@ namespace Falcon.SugarApi.ClaimTicket if(token.IsNullOrEmpty()) { token = bindingContext.HttpContext.Request.Headers[this.Options.HttpHeaderKey].ToString(); } - var model = this.Builter.GetUser(token); + UserTicket? model; + try { + model = this.TicketBuilder.GetUser(token); + } + catch(System.Exception ex) { + this.Logger.LogError($"通过token生成用户时发生错误\n{ex}"); + return FailBind(bindingContext); + } if(model == null) { return FailBind(bindingContext); } diff --git a/Falcon.SugarApi/ClaimTicket/ClaimTicketOptions.cs b/Falcon.SugarApi/ClaimTicket/ClaimTicketOptions.cs index 38ae730..b1285d0 100644 --- a/Falcon.SugarApi/ClaimTicket/ClaimTicketOptions.cs +++ b/Falcon.SugarApi/ClaimTicket/ClaimTicketOptions.cs @@ -15,13 +15,5 @@ namespace Falcon.SugarApi.ClaimTicket /// http头票据key /// public string HttpHeaderKey { get; set; } = "_authUserTicket"; - /// - /// 安全加密组件 - /// - public IEncryption Encryption { get; set; } - /// - /// 序列化组件 - /// - public ISerialize JsonSerialize { get; set; } } } diff --git a/Falcon.SugarApi/ClaimTicket/Readme.md b/Falcon.SugarApi/ClaimTicket/Readme.md index 586dfc7..2045631 100644 --- a/Falcon.SugarApi/ClaimTicket/Readme.md +++ b/Falcon.SugarApi/ClaimTicket/Readme.md @@ -83,6 +83,8 @@ public string Viewbind(string _authUserTicket,[FromHeader] UserTicket user) { һͻͨHTTPͷ_authUserTicketύûƾݣΪ˷ͨgetύƱݣԶUserTicketС Ϊactionͨhttpbodyȡһ_authUserTicketUserTicketҪ[FromHeader]ԡ +## ϹͿʹˣʱǻһЩ󣬿ͨķʽչ + ### 6ԶClaimTicket ͨClaimTicketOptionsáõ; > 1ڲעԼClaimTicketOptions @@ -102,7 +104,7 @@ public string Viewbind(string _authUserTicket,[FromHeader] UserTicket user) { > } > } > ~~~ -> 2ڲעԼClaimTicketOptions +> 2services.AddClaimTicketдClaimTicketOptions > ~~~c# > public class ServicePlugin:IServicePlugin > { @@ -178,3 +180,103 @@ public class ServicePlugin:IServicePlugin } ~~~ +### 8չUserTicket +UserTicket̳ʵԼû࣬´ʵԼMyUserTicket࣬һVerԡ +~~~c# +public class MyUserTicket:UserTicket +{ + public MyUserTicket() {} + + public int Ver { get; set; } + + public MyUserTicket(UserTicket? user) { + this.Claims = user?.Claims; + } +} +~~~ +ȻҪʵԼITicketBuilderʵ֣ΪUserTicket֪δVer +~~~c# +/// +/// ԶƱɷʽ +/// +public class MyTicketBuilder:TicketBuilder, ITicketBuilder +{ + /// + /// ʹƱݲ + /// + /// ɲ + public MyTicketBuilder(ClaimTicketOptions options,IEncryption encryption,IJsonSerialize serialize) + : base(options,encryption,serialize) { } + + /// + public override string? GetTicket(UserTicket userTicket) { + //ʵԼƱɷ + if(userTicket is MyUserTicket mut) { + var obj = mut.Claims.Select(a => new ClaimKeyValue { Key = a.Type,Value = a.Value }); + var ll = obj.ToList(); + ll.Add(new ClaimKeyValue { Key = "Ver",Value = mut.Ver.ToString() }); + var str = this.Serialize.Serialize(ll); + var code = this.Encryption.Encrypt(this.Options.EncryptionKey,str); + return code; + } + //ʹûṩķ + return base.GetTicket(userTicket); + } + + /// + public override UserTicket? GetUser(string ticket) { + //ƱݻȡûûϢ + var str = this.Encryption.Decrypt(this.Options.EncryptionKey,ticket); + if(str.IsNullOrEmpty()) { + return new MyUserTicket(); + } + var list = this.Serialize.Deserialize>(str); + if(list == null) { + return new MyUserTicket(); + } + var ut = new UserTicket(list.Select(a => new Claim(a.Key,a.Value))); + var result = new MyUserTicket(ut); + var verf = list.Find(a => a.Key == "Ver"); + if(verf != null) { + result.Ver = int.Parse(verf.Value); + } + //ʹûṩķ + return result as UserTicket; + } +} +~~~ +ȻʹķʽITicketBuilderע +žڵ¼ʱʹԼƱ +~~~c# +public string Login(string username) { + //֤ûЧԣеݿ֤ + + //֤ͨûƱ + var user = new UserTicket( + //û + new Claim("name",username), + //Ҫ + new Claim("role","admin") + ); + var muser = new MyUserTicket(user); + //Լ + muser.Ver = 5; + var ticket = this.TicketBuilder.GetTicket(muser); + return ticket ?? ""; +} + +~~~ +ʹõʱֱע룺 +~~~c# +public string Viewbind(string _authUserTicket,[FromHeader] MyUserTicket? user) { + if(user == null) { + return "ʧܣ"; + } + StringBuilder sb = new(); + foreach(var i in user.Claims) { + sb.AppendLine($"type:{i.Type},Val:{i.Value}"); + } + sb.AppendLine($"user.Ver={user.Ver}"); + return sb.ToString(); +} +~~~ diff --git a/Falcon.SugarApi/ClaimTicket/ServiceCollectionExtend.cs b/Falcon.SugarApi/ClaimTicket/ServiceCollectionExtend.cs index c6e4be9..c95419d 100644 --- a/Falcon.SugarApi/ClaimTicket/ServiceCollectionExtend.cs +++ b/Falcon.SugarApi/ClaimTicket/ServiceCollectionExtend.cs @@ -3,10 +3,6 @@ using Falcon.SugarApi.JsonSerialize; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Falcon.SugarApi.ClaimTicket { @@ -22,18 +18,15 @@ namespace Falcon.SugarApi.ClaimTicket /// 配置创建 /// 服务集合 public static IServiceCollection AddClaimTicket(this IServiceCollection services,Action? OptionBuilder = null) { - services.TryAddSingleton(p => { - var en = p.GetRequiredService(); - var ser = p.GetRequiredService(); - var option = new ClaimTicketOptions { - Encryption = en,JsonSerialize = ser, - }; - OptionBuilder?.Invoke(option); - return option; - }); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); + + services.TryAddSingleton(p => { + var option = new ClaimTicketOptions(); + OptionBuilder?.Invoke(option); + return option; + }); services.AddControllers(op => { op.ModelBinderProviders.Insert(0,new ClaimTicketModelBindingProvider()); }); diff --git a/Falcon.SugarApi/ClaimTicket/TicketBuilder.cs b/Falcon.SugarApi/ClaimTicket/TicketBuilder.cs index 72a52e8..24ffedf 100644 --- a/Falcon.SugarApi/ClaimTicket/TicketBuilder.cs +++ b/Falcon.SugarApi/ClaimTicket/TicketBuilder.cs @@ -1,4 +1,5 @@ using Falcon.SugarApi.Encryption; +using Falcon.SugarApi.JsonSerialize; using System.Collections.Generic; using System.Linq; using System.Security.Claims; @@ -13,24 +14,26 @@ namespace Falcon.SugarApi.ClaimTicket /// /// 构造票据生成器 /// - /// 加密配置 - public TicketBuilder(ClaimTicketOptions options) { - this.Encryption = options.Encryption; - this.Serialize = options.JsonSerialize; + /// 配置 + /// 安全加密组件 + /// 序列化组件 + public TicketBuilder(ClaimTicketOptions options,IEncryption encryption,IJsonSerialize serialize) { this.Options = options; + Encryption = encryption; + Serialize = serialize; } /// - /// 加密模块 - /// - public IEncryption Encryption { get; } - /// - /// 序列化模块 - /// - public ISerialize Serialize { get; } - /// /// 票据生成配置 /// public ClaimTicketOptions Options { get; } + /// + /// 安全加密组件 + /// + public IEncryption Encryption { get; } + /// + /// json序列化组件 + /// + public ISerialize Serialize { get; } /// public virtual UserTicket? GetUser(string ticket) {