diff --git a/Admin.NET/Admin.NET.Application/Service/Test/DemoOpenApi.cs b/Admin.NET/Admin.NET.Application/Service/Test/DemoOpenApi.cs
index d09b5ac0..76f806a9 100644
--- a/Admin.NET/Admin.NET.Application/Service/Test/DemoOpenApi.cs
+++ b/Admin.NET/Admin.NET.Application/Service/Test/DemoOpenApi.cs
@@ -4,13 +4,14 @@
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+
namespace Admin.NET.Application;
///
/// 开放接口示例
///
[ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)]
-[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)]
public class DemoOpenApi : IDynamicApiController
{
private readonly UserManager _userManager;
@@ -19,10 +20,26 @@ public class DemoOpenApi : IDynamicApiController
{
_userManager = userManager;
}
-
- [HttpGet("helloWord")]
- public Task HelloWord()
+
+ ///
+ /// SignatureAuthentication
+ ///
+ ///
+ [HttpGet("helloWordSignatureAuthentication")]
+ [Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)]
+ public Task HelloWordSignatureAuthentication()
{
- return Task.FromResult($"Hello, {_userManager.Account}.");
+ return Task.FromResult($"Hello 只能支持 OpenApi, {_userManager.Account}.");
+ }
+
+ ///
+ /// SignatureAuthenticationJwt
+ ///
+ ///
+ [HttpGet("HelloWordSignatureAuthenticationOrJwt")]
+ [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
+ public Task HelloWordSignatureAuthenticationOrJwt()
+ {
+ return Task.FromResult($"Hello 支持 OpenApi 或 Jwt, {_userManager.Account}.");
}
}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/GenerateSignatureOutput.cs b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/GenerateSignatureOutput.cs
new file mode 100644
index 00000000..c5d4efd3
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/GenerateSignatureOutput.cs
@@ -0,0 +1,25 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Admin.NET.Core.Service;
+public class GenerateSignatureOutput
+{
+ ///
+ /// 时间戳
+ ///
+ public long Timestamp { get; set; }
+
+ ///
+ /// 签名
+ ///
+ public string Signature { get; set; }
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs b/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs
index c5477667..93652663 100644
--- a/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs
@@ -34,8 +34,12 @@ public class SysOpenAccessService : IDynamicApiController, ITransient
///
///
[DisplayName("生成签名")]
- public string GenerateSignature(GenerateSignatureInput input)
- {
+ public GenerateSignatureOutput GenerateSignature(GenerateSignatureInput input)
+ {
+ if (input.Timestamp==0)
+ {
+ input.Timestamp = DateTimeUtil.ToUnixTimestampByMilliseconds(DateTime.Now);
+ }
// 密钥
var appSecretByte = Encoding.UTF8.GetBytes(input.AccessSecret);
@@ -45,7 +49,11 @@ public class SysOpenAccessService : IDynamicApiController, ITransient
using HMAC hmac = new HMACSHA256();
hmac.Key = appSecretByte;
var sign = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(parameter)));
- return sign;
+ return new GenerateSignatureOutput
+ {
+ Timestamp = input.Timestamp,
+ Signature = sign
+ };
}
///
diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs
index ee231b06..2ad5bd69 100644
--- a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs
+++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs
@@ -1,4 +1,4 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
@@ -75,7 +75,7 @@ public sealed class SignatureAuthenticationHandler : AuthenticationHandler();
- var cacheKey = $"{CacheConst.KeyOpenAccessNonce}{accessKey}|{nonce}";
+ var cacheKey = $"{CacheConst.KeyOpenAccessNonce}{accessKey}|{timestampStr}|{nonce}";
if (cache.ExistKey(cacheKey))
return await AuthenticateResultFailAsync("重复的请求");
cache.Set(cacheKey, null, Options.AllowedDateDrift * 2); // 缓存过期时间为偏差范围时间的2倍