6 changed files with 604 additions and 0 deletions
@ -0,0 +1,104 @@ |
|||
# LINGYUN.Abp.OpenApi.Authorization |
|||
|
|||
OpenApi authentication authorization middleware module, providing AppKey/AppSecret based API signature authentication middleware functionality for ABP applications. |
|||
|
|||
## Features |
|||
|
|||
* Provides OpenApi authentication middleware |
|||
* Supports request signature verification |
|||
* Supports replay attack prevention (Nonce random number verification) |
|||
* Supports request timestamp verification |
|||
* Supports client whitelist verification |
|||
* Supports IP address whitelist verification |
|||
* Supports custom authentication logic |
|||
* Supports exception handling and error message wrapping |
|||
|
|||
## Installation |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi.Authorization |
|||
``` |
|||
|
|||
## Module Dependencies |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiAuthorizationModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## Basic Usage |
|||
|
|||
1. Enable OpenApi Authentication Middleware |
|||
```csharp |
|||
public void Configure(IApplicationBuilder app) |
|||
{ |
|||
// Add OpenApi authentication middleware |
|||
app.UseOpenApiAuthorization(); |
|||
} |
|||
``` |
|||
|
|||
2. Custom Authentication Service (Optional) |
|||
```csharp |
|||
public class CustomOpenApiAuthorizationService : OpenApiAuthorizationService |
|||
{ |
|||
public CustomOpenApiAuthorizationService( |
|||
INonceStore nonceStore, |
|||
IAppKeyStore appKeyStore, |
|||
IClientChecker clientChecker, |
|||
IIpAddressChecker ipAddressChecker, |
|||
IWebClientInfoProvider clientInfoProvider, |
|||
IOptionsMonitor<AbpOpenApiOptions> options, |
|||
IOptions<AbpExceptionHandlingOptions> exceptionHandlingOptions) |
|||
: base(nonceStore, appKeyStore, clientChecker, ipAddressChecker, |
|||
clientInfoProvider, options, exceptionHandlingOptions) |
|||
{ |
|||
} |
|||
|
|||
// Override authentication logic |
|||
public override async Task<bool> AuthorizeAsync(HttpContext httpContext) |
|||
{ |
|||
// Implement custom authentication logic |
|||
return await base.AuthorizeAsync(httpContext); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## Authentication Process |
|||
|
|||
1. Validate Client IP Address |
|||
* Verify if the client IP address is within the allowed range through the `IIpAddressChecker` interface |
|||
|
|||
2. Validate Application Credentials |
|||
* Verify AppKey, signature, nonce, and timestamp in request headers |
|||
* Get application information through the `IAppKeyStore` interface |
|||
* Verify client access permission through the `IClientChecker` interface |
|||
* Validate signature validity and timeliness |
|||
|
|||
## Signature Rules |
|||
|
|||
1. Sort request parameters by parameter name in ASCII order |
|||
2. Convert sorted parameters to query string using URL encoding (UTF-8) |
|||
3. Concatenate request path and query string, then perform MD5 encryption to get the signature |
|||
|
|||
Example: |
|||
``` |
|||
Request path: /api/test |
|||
Parameters: |
|||
appKey=test |
|||
appSecret=123456 |
|||
nonce=abc |
|||
t=1577808000000 |
|||
|
|||
Signature calculation: |
|||
1. Sort and concatenate parameters: appKey=test&appSecret=123456&nonce=abc&t=1577808000000 |
|||
2. Concatenate with request path: /api/test?appKey=test&appSecret=123456&nonce=abc&t=1577808000000 |
|||
3. URL encode and MD5 encrypt to get the final signature |
|||
``` |
|||
|
|||
## More Information |
|||
|
|||
* [LINGYUN.Abp.OpenApi](../LINGYUN.Abp.OpenApi/README.md) |
|||
* [ABP Framework](https://abp.io/) |
|||
@ -0,0 +1,104 @@ |
|||
# LINGYUN.Abp.OpenApi.Authorization |
|||
|
|||
OpenApi 认证授权中间件模块,为 ABP 应用程序提供基于 AppKey/AppSecret 的 API 签名认证中间件功能。 |
|||
|
|||
## 功能特性 |
|||
|
|||
* 提供 OpenApi 认证中间件 |
|||
* 支持请求签名验证 |
|||
* 支持防重放攻击(Nonce随机数验证) |
|||
* 支持请求时间戳验证 |
|||
* 支持客户端白名单验证 |
|||
* 支持IP地址白名单验证 |
|||
* 支持自定义认证逻辑 |
|||
* 支持异常处理和错误信息包装 |
|||
|
|||
## 安装 |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi.Authorization |
|||
``` |
|||
|
|||
## 模块引用 |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiAuthorizationModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## 基本用法 |
|||
|
|||
1. 启用 OpenApi 认证中间件 |
|||
```csharp |
|||
public void Configure(IApplicationBuilder app) |
|||
{ |
|||
// 添加 OpenApi 认证中间件 |
|||
app.UseOpenApiAuthorization(); |
|||
} |
|||
``` |
|||
|
|||
2. 自定义认证服务(可选) |
|||
```csharp |
|||
public class CustomOpenApiAuthorizationService : OpenApiAuthorizationService |
|||
{ |
|||
public CustomOpenApiAuthorizationService( |
|||
INonceStore nonceStore, |
|||
IAppKeyStore appKeyStore, |
|||
IClientChecker clientChecker, |
|||
IIpAddressChecker ipAddressChecker, |
|||
IWebClientInfoProvider clientInfoProvider, |
|||
IOptionsMonitor<AbpOpenApiOptions> options, |
|||
IOptions<AbpExceptionHandlingOptions> exceptionHandlingOptions) |
|||
: base(nonceStore, appKeyStore, clientChecker, ipAddressChecker, |
|||
clientInfoProvider, options, exceptionHandlingOptions) |
|||
{ |
|||
} |
|||
|
|||
// 重写认证逻辑 |
|||
public override async Task<bool> AuthorizeAsync(HttpContext httpContext) |
|||
{ |
|||
// 实现自定义认证逻辑 |
|||
return await base.AuthorizeAsync(httpContext); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 认证流程 |
|||
|
|||
1. 验证客户端IP地址 |
|||
* 通过 `IIpAddressChecker` 接口验证客户端IP地址是否在允许范围内 |
|||
|
|||
2. 验证应用凭证 |
|||
* 验证请求头中的 AppKey、签名、随机数和时间戳 |
|||
* 通过 `IAppKeyStore` 接口获取应用信息 |
|||
* 通过 `IClientChecker` 接口验证客户端是否允许访问 |
|||
* 验证签名的有效性和时效性 |
|||
|
|||
## 签名规则 |
|||
|
|||
1. 请求参数按照参数名ASCII码从小到大排序 |
|||
2. 使用URL编码(UTF-8)将排序后的参数转换为查询字符串 |
|||
3. 将请求路径和查询字符串拼接后进行MD5加密得到签名 |
|||
|
|||
示例: |
|||
``` |
|||
请求路径:/api/test |
|||
参数: |
|||
appKey=test |
|||
appSecret=123456 |
|||
nonce=abc |
|||
t=1577808000000 |
|||
|
|||
签名计算: |
|||
1. 参数排序并拼接:appKey=test&appSecret=123456&nonce=abc&t=1577808000000 |
|||
2. 拼接请求路径:/api/test?appKey=test&appSecret=123456&nonce=abc&t=1577808000000 |
|||
3. URL编码并MD5加密得到最终签名 |
|||
``` |
|||
|
|||
## 更多信息 |
|||
|
|||
* [LINGYUN.Abp.OpenApi](../LINGYUN.Abp.OpenApi/README.md) |
|||
* [ABP框架](https://abp.io/) |
|||
@ -0,0 +1,93 @@ |
|||
# LINGYUN.Abp.OpenApi.IdentityServer |
|||
|
|||
OpenApi IdentityServer integration module, providing IdentityServer-based AppKey/AppSecret storage implementation. |
|||
|
|||
## Features |
|||
|
|||
* IdentityServer-based AppKey/AppSecret storage |
|||
* Automatic mapping of AppKey to IdentityServer client identifier |
|||
* Automatic mapping of AppSecret to client secret |
|||
* Support for signature validity period configuration |
|||
* Support for client name configuration |
|||
* Automatic creation and update of client information |
|||
|
|||
## Installation |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi.IdentityServer |
|||
``` |
|||
|
|||
## Module Dependencies |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiIdentityServerModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## How It Works |
|||
|
|||
1. AppKey Mapping |
|||
* AppKey is mapped to IdentityServer's ClientId |
|||
* Client query and management through the `IClientRepository` interface |
|||
|
|||
2. AppSecret Mapping |
|||
* AppSecret is mapped to client secret |
|||
* Secret is stored with AppSecret as identifier |
|||
|
|||
3. Signature Validity Period |
|||
* SignLifetime is stored as a custom property of the client |
|||
* Property name is "SignLifetime", value is validity period in seconds |
|||
|
|||
## Basic Usage |
|||
|
|||
1. Store Application Credentials |
|||
```csharp |
|||
public class YourService |
|||
{ |
|||
private readonly IAppKeyStore _appKeyStore; |
|||
|
|||
public YourService(IAppKeyStore appKeyStore) |
|||
{ |
|||
_appKeyStore = appKeyStore; |
|||
} |
|||
|
|||
public async Task CreateAppAsync() |
|||
{ |
|||
var descriptor = new AppDescriptor( |
|||
appName: "Test Application", |
|||
appKey: "your-app-key", |
|||
appSecret: "your-app-secret", |
|||
signLifeTime: 300 // 5 minutes validity |
|||
); |
|||
|
|||
await _appKeyStore.StoreAsync(descriptor); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
2. Query Application Credentials |
|||
```csharp |
|||
public class YourService |
|||
{ |
|||
private readonly IAppKeyStore _appKeyStore; |
|||
|
|||
public YourService(IAppKeyStore appKeyStore) |
|||
{ |
|||
_appKeyStore = appKeyStore; |
|||
} |
|||
|
|||
public async Task<AppDescriptor> GetAppAsync(string appKey) |
|||
{ |
|||
return await _appKeyStore.FindAsync(appKey); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## More Information |
|||
|
|||
* [LINGYUN.Abp.OpenApi](../LINGYUN.Abp.OpenApi/README.md) |
|||
* [LINGYUN.Abp.OpenApi.Authorization](../LINGYUN.Abp.OpenApi.Authorization/README.md) |
|||
* [IdentityServer](https://identityserver4.readthedocs.io/) |
|||
@ -0,0 +1,93 @@ |
|||
# LINGYUN.Abp.OpenApi.IdentityServer |
|||
|
|||
OpenApi IdentityServer 集成模块,提供基于 IdentityServer 的 AppKey/AppSecret 存储实现。 |
|||
|
|||
## 功能特性 |
|||
|
|||
* 基于 IdentityServer 的 AppKey/AppSecret 存储 |
|||
* 自动将 AppKey 映射为 IdentityServer 客户端标识 |
|||
* 自动将 AppSecret 映射为客户端密钥 |
|||
* 支持签名有效期配置 |
|||
* 支持客户端名称配置 |
|||
* 自动创建和更新客户端信息 |
|||
|
|||
## 安装 |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi.IdentityServer |
|||
``` |
|||
|
|||
## 模块引用 |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiIdentityServerModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## 工作原理 |
|||
|
|||
1. AppKey 映射 |
|||
* AppKey 将被映射为 IdentityServer 的 ClientId |
|||
* 通过 `IClientRepository` 接口进行客户端查询和管理 |
|||
|
|||
2. AppSecret 映射 |
|||
* AppSecret 将被映射为客户端密钥(Client Secret) |
|||
* 密钥将以 AppSecret 作为标识存储 |
|||
|
|||
3. 签名有效期 |
|||
* SignLifetime 将被存储为客户端的自定义属性 |
|||
* 属性名为 "SignLifetime",值为有效期秒数 |
|||
|
|||
## 基本用法 |
|||
|
|||
1. 存储应用凭证 |
|||
```csharp |
|||
public class YourService |
|||
{ |
|||
private readonly IAppKeyStore _appKeyStore; |
|||
|
|||
public YourService(IAppKeyStore appKeyStore) |
|||
{ |
|||
_appKeyStore = appKeyStore; |
|||
} |
|||
|
|||
public async Task CreateAppAsync() |
|||
{ |
|||
var descriptor = new AppDescriptor( |
|||
appName: "测试应用", |
|||
appKey: "your-app-key", |
|||
appSecret: "your-app-secret", |
|||
signLifeTime: 300 // 5分钟有效期 |
|||
); |
|||
|
|||
await _appKeyStore.StoreAsync(descriptor); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
2. 查询应用凭证 |
|||
```csharp |
|||
public class YourService |
|||
{ |
|||
private readonly IAppKeyStore _appKeyStore; |
|||
|
|||
public YourService(IAppKeyStore appKeyStore) |
|||
{ |
|||
_appKeyStore = appKeyStore; |
|||
} |
|||
|
|||
public async Task<AppDescriptor> GetAppAsync(string appKey) |
|||
{ |
|||
return await _appKeyStore.FindAsync(appKey); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 更多信息 |
|||
|
|||
* [LINGYUN.Abp.OpenApi](../LINGYUN.Abp.OpenApi/README.md) |
|||
* [LINGYUN.Abp.OpenApi.Authorization](../LINGYUN.Abp.OpenApi.Authorization/README.md) |
|||
* [IdentityServer](https://identityserver4.readthedocs.io/) |
|||
@ -0,0 +1,105 @@ |
|||
# LINGYUN.Abp.OpenApi |
|||
|
|||
OpenApi authentication module, providing AppKey/AppSecret based API signature authentication functionality for ABP applications. |
|||
|
|||
## Features |
|||
|
|||
* Supports AppKey/AppSecret authentication |
|||
* Supports request signature verification |
|||
* Supports replay attack prevention (Nonce random number verification) |
|||
* Supports request timestamp verification |
|||
* Supports client whitelist |
|||
* Supports IP address whitelist |
|||
* Supports multilingual error messages |
|||
|
|||
## Installation |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi |
|||
``` |
|||
|
|||
## Module Dependencies |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## Configuration |
|||
|
|||
```json |
|||
{ |
|||
"OpenApi": { |
|||
"IsEnabled": true, // Enable API signature check, default: true |
|||
"RequestNonceExpireIn": "00:10:00", // Request nonce expiration time, default: 10 minutes |
|||
"AppDescriptors": [ // AppKey configuration list |
|||
{ |
|||
"AppName": "Test Application", // Application name |
|||
"AppKey": "your-app-key", // Application key |
|||
"AppSecret": "your-app-secret", // Application secret |
|||
"AppToken": "optional-token", // Optional application token |
|||
"SignLifetime": 300 // Signature validity period (seconds) |
|||
} |
|||
] |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## Basic Usage |
|||
|
|||
1. Configure AppKey/AppSecret |
|||
* Add AppKey and AppSecret in the configuration file |
|||
* Or implement custom `IAppKeyStore` interface to manage AppKey |
|||
|
|||
2. Enable OpenApi Authentication |
|||
```csharp |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
Configure<AbpOpenApiOptions>(configuration.GetSection("OpenApi")); |
|||
} |
|||
``` |
|||
|
|||
3. Custom Client Verification (Optional) |
|||
```csharp |
|||
public class CustomClientChecker : IClientChecker |
|||
{ |
|||
public Task<bool> IsGrantAsync(string clientId, CancellationToken cancellationToken = default) |
|||
{ |
|||
// Implement custom client verification logic |
|||
return Task.FromResult(true); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
4. Custom IP Address Verification (Optional) |
|||
```csharp |
|||
public class CustomIpAddressChecker : IIpAddressChecker |
|||
{ |
|||
public Task<bool> IsGrantAsync(string ipAddress, CancellationToken cancellationToken = default) |
|||
{ |
|||
// Implement custom IP address verification logic |
|||
return Task.FromResult(true); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## Error Codes |
|||
|
|||
* AbpOpenApi:9100 - Invalid AppKey |
|||
* AbpOpenApi:9101 - AppKey not found |
|||
* AbpOpenApi:9110 - Invalid sign |
|||
* AbpOpenApi:9111 - Sign not found |
|||
* AbpOpenApi:9210 - Request timed out or session expired |
|||
* AbpOpenApi:9211 - Timestamp not found |
|||
* AbpOpenApi:9220 - Repeatedly initiated requests |
|||
* AbpOpenApi:9221 - Nonce not found |
|||
* AbpOpenApi:9300 - Client is not within the allowed range |
|||
* AbpOpenApi:9400 - Client IP is not within the allowed range |
|||
|
|||
## More Information |
|||
|
|||
* [ABP Framework](https://abp.io/) |
|||
@ -0,0 +1,105 @@ |
|||
# LINGYUN.Abp.OpenApi |
|||
|
|||
OpenApi 认证模块,为 ABP 应用程序提供基于 AppKey/AppSecret 的 API 签名认证功能。 |
|||
|
|||
## 功能特性 |
|||
|
|||
* 支持 AppKey/AppSecret 认证 |
|||
* 支持请求签名验证 |
|||
* 支持防重放攻击(Nonce随机数验证) |
|||
* 支持请求时间戳验证 |
|||
* 支持客户端白名单 |
|||
* 支持IP地址白名单 |
|||
* 支持多语言错误消息 |
|||
|
|||
## 安装 |
|||
|
|||
```bash |
|||
dotnet add package LINGYUN.Abp.OpenApi |
|||
``` |
|||
|
|||
## 模块引用 |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpOpenApiModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
|
|||
## 配置项 |
|||
|
|||
```json |
|||
{ |
|||
"OpenApi": { |
|||
"IsEnabled": true, // 是否启用API签名检查,默认: true |
|||
"RequestNonceExpireIn": "00:10:00", // 请求随机数过期时间,默认: 10分钟 |
|||
"AppDescriptors": [ // AppKey配置列表 |
|||
{ |
|||
"AppName": "测试应用", // 应用名称 |
|||
"AppKey": "你的AppKey", // 应用标识 |
|||
"AppSecret": "你的AppSecret", // 应用密钥 |
|||
"AppToken": "可选的Token", // 可选的应用令牌 |
|||
"SignLifetime": 300 // 签名有效期(秒) |
|||
} |
|||
] |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 基本用法 |
|||
|
|||
1. 配置 AppKey/AppSecret |
|||
* 在配置文件中添加 AppKey 和 AppSecret |
|||
* 或者实现自定义的 `IAppKeyStore` 接口来管理 AppKey |
|||
|
|||
2. 启用 OpenApi 认证 |
|||
```csharp |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
Configure<AbpOpenApiOptions>(configuration.GetSection("OpenApi")); |
|||
} |
|||
``` |
|||
|
|||
3. 自定义客户端验证(可选) |
|||
```csharp |
|||
public class CustomClientChecker : IClientChecker |
|||
{ |
|||
public Task<bool> IsGrantAsync(string clientId, CancellationToken cancellationToken = default) |
|||
{ |
|||
// 实现自定义的客户端验证逻辑 |
|||
return Task.FromResult(true); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
4. 自定义IP地址验证(可选) |
|||
```csharp |
|||
public class CustomIpAddressChecker : IIpAddressChecker |
|||
{ |
|||
public Task<bool> IsGrantAsync(string ipAddress, CancellationToken cancellationToken = default) |
|||
{ |
|||
// 实现自定义的IP地址验证逻辑 |
|||
return Task.FromResult(true); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 错误代码 |
|||
|
|||
* AbpOpenApi:9100 - 无效的应用标识 |
|||
* AbpOpenApi:9101 - 未携带应用标识 |
|||
* AbpOpenApi:9110 - 无效的签名 |
|||
* AbpOpenApi:9111 - 未携带签名 |
|||
* AbpOpenApi:9210 - 请求超时或会话已过期 |
|||
* AbpOpenApi:9211 - 未携带时间戳标识 |
|||
* AbpOpenApi:9220 - 重复发起的请求 |
|||
* AbpOpenApi:9221 - 未携带随机数 |
|||
* AbpOpenApi:9300 - 客户端不在允许的范围内 |
|||
* AbpOpenApi:9400 - 客户端IP不在允许的范围内 |
|||
|
|||
## 更多信息 |
|||
|
|||
* [ABP框架](https://abp.io/) |
|||
Loading…
Reference in new issue