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) {