committed by
GitHub
214 changed files with 2047 additions and 832 deletions
@ -0,0 +1,21 @@ |
|||
using Microsoft.Extensions.Logging; |
|||
using Volo.Abp; |
|||
using Volo.Abp.ExceptionHandling; |
|||
using Volo.Abp.Logging; |
|||
|
|||
namespace LINYUN.Abp.Aliyun |
|||
{ |
|||
public class AbpAliyunException : AbpException, IHasErrorCode, IHasLogLevel |
|||
{ |
|||
public LogLevel LogLevel { get; set; } |
|||
|
|||
public string Code { get; } |
|||
|
|||
public AbpAliyunException(string code, string message) |
|||
: base(message) |
|||
{ |
|||
Code = code; |
|||
LogLevel = LogLevel.Warning; |
|||
} |
|||
} |
|||
} |
|||
@ -1,21 +1,25 @@ |
|||
using LINYUN.Abp.Aliyun.Localization; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.Json; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.Settings; |
|||
using Volo.Abp.VirtualFileSystem; |
|||
|
|||
namespace LINGYUN.Abp.Aliyun |
|||
{ |
|||
[DependsOn( |
|||
typeof(AbpCachingModule), |
|||
typeof(AbpSettingsModule), |
|||
typeof(AbpJsonModule), |
|||
typeof(AbpLocalizationModule))] |
|||
public class AbpAliyunCloudModule : AbpModule |
|||
public class AbpAliyunModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpVirtualFileSystemOptions>(options => |
|||
{ |
|||
options.FileSets.AddEmbedded<AbpAliyunCloudModule>(); |
|||
options.FileSets.AddEmbedded<AbpAliyunModule>(); |
|||
}); |
|||
|
|||
Configure<AbpLocalizationOptions>(options => |
|||
@ -0,0 +1,32 @@ |
|||
using Aliyun.Acs.Core; |
|||
using Aliyun.Acs.Core.Auth; |
|||
using Aliyun.Acs.Core.Profile; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINYUN.Abp.Aliyun |
|||
{ |
|||
public class AcsClientFactory : AliyunClientFactory<IAcsClient>, IAcsClientFactory, ITransientDependency |
|||
{ |
|||
public AcsClientFactory( |
|||
ISettingProvider settingProvider, |
|||
IDistributedCache<AliyunBasicSessionCredentialsCacheItem> cache) |
|||
: base(settingProvider, cache) |
|||
{ |
|||
} |
|||
|
|||
protected override IAcsClient GetClient(string regionId, string accessKeyId, string accessKeySecret) |
|||
{ |
|||
return new DefaultAcsClient( |
|||
DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret)); |
|||
} |
|||
|
|||
protected override IAcsClient GetSecurityTokenClient(string regionId, string accessKeyId, string accessKeySecret, string securityToken) |
|||
{ |
|||
var profile = DefaultProfile.GetProfile(regionId); |
|||
var credentials = new BasicSessionCredentials(accessKeyId, accessKeySecret, securityToken); |
|||
return new DefaultAcsClient(profile, credentials); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
using System; |
|||
|
|||
namespace LINYUN.Abp.Aliyun |
|||
{ |
|||
[Serializable] |
|||
public class AliyunBasicSessionCredentialsCacheItem |
|||
{ |
|||
private readonly static string _cacheKey; |
|||
public static string CacheKey => _cacheKey; |
|||
public string AccessKeyId { get; set; } |
|||
public string AccessKeySecret { get; set; } |
|||
public string SecurityToken { get; set; } |
|||
|
|||
static AliyunBasicSessionCredentialsCacheItem() |
|||
{ |
|||
_cacheKey = Guid.NewGuid().ToString("N"); |
|||
} |
|||
|
|||
public AliyunBasicSessionCredentialsCacheItem() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public AliyunBasicSessionCredentialsCacheItem(string accessKeyId, string accessKeySecret, string securityToken) |
|||
{ |
|||
AccessKeyId = accessKeyId; |
|||
AccessKeySecret = accessKeySecret; |
|||
SecurityToken = securityToken; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,180 @@ |
|||
using Aliyun.Acs.Core; |
|||
using Aliyun.Acs.Core.Auth.Sts; |
|||
using Aliyun.Acs.Core.Http; |
|||
using Aliyun.Acs.Core.Profile; |
|||
using LINYUN.Abp.Aliyun.Settings; |
|||
using Microsoft.Extensions.Caching.Distributed; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINYUN.Abp.Aliyun |
|||
{ |
|||
/// <summary>
|
|||
/// 阿里云通用客户端构建工厂
|
|||
/// </summary>
|
|||
/// <typeparam name="TClient"></typeparam>
|
|||
public abstract class AliyunClientFactory<TClient> |
|||
{ |
|||
protected ISettingProvider SettingProvider { get; } |
|||
protected IDistributedCache<AliyunBasicSessionCredentialsCacheItem> Cache { get; } |
|||
public AliyunClientFactory( |
|||
ISettingProvider settingProvider, |
|||
IDistributedCache<AliyunBasicSessionCredentialsCacheItem> cache) |
|||
{ |
|||
Cache = cache; |
|||
SettingProvider = settingProvider; |
|||
} |
|||
|
|||
public virtual async Task<TClient> CreateAsync() |
|||
{ |
|||
var regionId = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RegionId); |
|||
var accessKey = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.AccessKeyId); |
|||
var accessKeySecret = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.AccessKeySecret); |
|||
|
|||
Check.NotNullOrWhiteSpace(regionId, AliyunSettingNames.Authorization.RegionId); |
|||
Check.NotNullOrWhiteSpace(accessKey, AliyunSettingNames.Authorization.AccessKeyId); |
|||
Check.NotNullOrWhiteSpace(accessKeySecret, AliyunSettingNames.Authorization.AccessKeySecret); |
|||
|
|||
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Authorization.UseSecurityTokenService)) |
|||
{ |
|||
var cacheItem = await GetCacheItemAsync(accessKey, accessKeySecret, regionId); |
|||
|
|||
return GetSecurityTokenClient(regionId, cacheItem.AccessKeyId, cacheItem.AccessKeySecret, cacheItem.SecurityToken); |
|||
} |
|||
|
|||
return GetClient(regionId, accessKey, accessKeySecret); |
|||
} |
|||
|
|||
protected abstract TClient GetClient(string regionId, string accessKeyId, string accessKeySecret); |
|||
|
|||
protected abstract TClient GetSecurityTokenClient(string regionId, string accessKeyId, string accessKeySecret, string securityToken); |
|||
|
|||
protected virtual async Task<AliyunBasicSessionCredentialsCacheItem> GetCacheItemAsync(string accessKeyId, string accessKeySecret, string regionId) |
|||
{ |
|||
var cacheItem = await Cache.GetAsync(AliyunBasicSessionCredentialsCacheItem.CacheKey); |
|||
if (cacheItem == null) |
|||
{ |
|||
var roleArn = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RamRoleArn); |
|||
var roleSession = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RoleSessionName); |
|||
Check.NotNullOrWhiteSpace(roleArn, AliyunSettingNames.Authorization.RamRoleArn); |
|||
|
|||
var policy = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.Policy); |
|||
var durationSeconds = await SettingProvider.GetAsync(AliyunSettingNames.Authorization.DurationSeconds, 3000); |
|||
|
|||
var profile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret); |
|||
var request = new AssumeRoleRequest |
|||
{ |
|||
AcceptFormat = FormatType.JSON, |
|||
RoleArn = roleArn, |
|||
RoleSessionName = roleSession, |
|||
DurationSeconds = durationSeconds, |
|||
Policy = policy.IsNullOrWhiteSpace() ? null : policy |
|||
}; |
|||
|
|||
var client = new DefaultAcsClient(profile); |
|||
var response = client.GetAcsResponse(request); |
|||
|
|||
cacheItem = new AliyunBasicSessionCredentialsCacheItem( |
|||
response.Credentials.AccessKeyId, |
|||
response.Credentials.AccessKeySecret, |
|||
response.Credentials.SecurityToken); |
|||
|
|||
await Cache.SetAsync( |
|||
AliyunBasicSessionCredentialsCacheItem.CacheKey, |
|||
cacheItem, |
|||
new DistributedCacheEntryOptions |
|||
{ |
|||
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(durationSeconds - 10) |
|||
}); |
|||
} |
|||
|
|||
return cacheItem; |
|||
} |
|||
} |
|||
/// <summary>
|
|||
/// 阿里云通用客户端构建工厂
|
|||
/// </summary>
|
|||
/// <typeparam name="TClient">客户端类型</typeparam>
|
|||
/// <typeparam name="TConfiguration">客户端参数类型</typeparam>
|
|||
public abstract class AliyunClientFactory<TClient, TConfiguration> |
|||
{ |
|||
protected ISettingProvider SettingProvider { get; } |
|||
protected IDistributedCache<AliyunBasicSessionCredentialsCacheItem> Cache { get; } |
|||
public AliyunClientFactory( |
|||
ISettingProvider settingProvider, |
|||
IDistributedCache<AliyunBasicSessionCredentialsCacheItem> cache) |
|||
{ |
|||
Cache = cache; |
|||
SettingProvider = settingProvider; |
|||
} |
|||
|
|||
public virtual async Task<TClient> CreateAsync(TConfiguration configuration) |
|||
{ |
|||
var regionId = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RegionId); |
|||
var accessKey = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.AccessKeyId); |
|||
var accessKeySecret = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.AccessKeySecret); |
|||
|
|||
Check.NotNullOrWhiteSpace(regionId, AliyunSettingNames.Authorization.RegionId); |
|||
Check.NotNullOrWhiteSpace(accessKey, AliyunSettingNames.Authorization.AccessKeyId); |
|||
Check.NotNullOrWhiteSpace(accessKeySecret, AliyunSettingNames.Authorization.AccessKeySecret); |
|||
|
|||
if (await SettingProvider.IsTrueAsync(AliyunSettingNames.Authorization.UseSecurityTokenService)) |
|||
{ |
|||
var cacheItem = await GetCacheItemAsync(accessKey, accessKeySecret, regionId); |
|||
|
|||
return GetSecurityTokenClient(configuration, regionId, cacheItem.AccessKeyId, cacheItem.AccessKeySecret, cacheItem.SecurityToken); |
|||
} |
|||
|
|||
return GetClient(configuration, regionId, accessKey, accessKeySecret); |
|||
} |
|||
|
|||
protected abstract TClient GetClient(TConfiguration configuration, string regionId, string accessKeyId, string accessKeySecret); |
|||
|
|||
protected abstract TClient GetSecurityTokenClient(TConfiguration configuration, string regionId, string accessKeyId, string accessKeySecret, string securityToken); |
|||
|
|||
protected virtual async Task<AliyunBasicSessionCredentialsCacheItem> GetCacheItemAsync(string accessKeyId, string accessKeySecret, string regionId) |
|||
{ |
|||
var cacheItem = await Cache.GetAsync(AliyunBasicSessionCredentialsCacheItem.CacheKey); |
|||
if (cacheItem == null) |
|||
{ |
|||
var roleArn = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RamRoleArn); |
|||
var roleSession = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.RoleSessionName); |
|||
Check.NotNullOrWhiteSpace(roleArn, AliyunSettingNames.Authorization.RamRoleArn); |
|||
|
|||
var policy = await SettingProvider.GetOrNullAsync(AliyunSettingNames.Authorization.Policy); |
|||
var durationSeconds = await SettingProvider.GetAsync(AliyunSettingNames.Authorization.DurationSeconds, 3000); |
|||
|
|||
var profile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret); |
|||
var request = new AssumeRoleRequest |
|||
{ |
|||
AcceptFormat = FormatType.JSON, |
|||
RoleArn = roleArn, |
|||
RoleSessionName = roleSession, |
|||
DurationSeconds = durationSeconds, |
|||
Policy = policy.IsNullOrWhiteSpace() ? null : policy |
|||
}; |
|||
|
|||
var client = new DefaultAcsClient(profile); |
|||
var response = client.GetAcsResponse(request); |
|||
|
|||
cacheItem = new AliyunBasicSessionCredentialsCacheItem( |
|||
response.Credentials.AccessKeyId, |
|||
response.Credentials.AccessKeySecret, |
|||
response.Credentials.SecurityToken); |
|||
|
|||
await Cache.SetAsync( |
|||
AliyunBasicSessionCredentialsCacheItem.CacheKey, |
|||
cacheItem, |
|||
new DistributedCacheEntryOptions |
|||
{ |
|||
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(durationSeconds - 10) |
|||
}); |
|||
} |
|||
|
|||
return cacheItem; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
using Aliyun.Acs.Core; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace LINYUN.Abp.Aliyun |
|||
{ |
|||
public interface IAcsClientFactory |
|||
{ |
|||
/// <summary>
|
|||
/// 构造一个通用的Acs客户端调用
|
|||
/// 通过CommonRequest调用可以不需要集成其他SDK包
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
Task<IAcsClient> CreateAsync(); |
|||
} |
|||
} |
|||
@ -1,5 +1,23 @@ |
|||
{ |
|||
"culture": "en", |
|||
"texts": { |
|||
"DisplayName:Authorization": "Authorization", |
|||
"Description:Authorization": "Authorization", |
|||
"DisplayName:RegionId": "Region Id", |
|||
"Description:RegionId": "Region Id", |
|||
"DisplayName:AccessKeyId": "AccessKey Id", |
|||
"Description:AccessKeyId": "AccessKey Id", |
|||
"DisplayName:AccessKeySecret": "AccessKey Secret", |
|||
"Description:AccessKeySecret": "AccessKey Secret", |
|||
"DisplayName:UseSecurityTokenService": "Use STS Token", |
|||
"Description:UseSecurityTokenService": "Use STS Token", |
|||
"DisplayName:RamRoleArn": "Ram Role Arn", |
|||
"Description:RamRoleArn": "Ram Role Arn", |
|||
"DisplayName:RoleSessionName": "Role Session Name", |
|||
"Description:RoleSessionName": "Role Session Name", |
|||
"DisplayName:DurationSeconds": "Duration Seconds,in seconds", |
|||
"Description:DurationSeconds": "Duration Seconds,in seconds", |
|||
"DisplayName:Policy": "Policy", |
|||
"Description:Policy": "Policy" |
|||
} |
|||
} |
|||
@ -1,5 +1,23 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"DisplayName:Authorization": "阿里云身份认证凭据", |
|||
"Description:Authorization": "阿里云身份认证凭据", |
|||
"DisplayName:RegionId": "地域ID", |
|||
"Description:RegionId": "正在使用的地域ID", |
|||
"DisplayName:AccessKeyId": "AccessKey Id", |
|||
"Description:AccessKeyId": "访问密钥标识", |
|||
"DisplayName:AccessKeySecret": "AccessKey Secret", |
|||
"Description:AccessKeySecret": "访问密钥", |
|||
"DisplayName:UseSecurityTokenService": "使用STS Token访问", |
|||
"Description:UseSecurityTokenService": "使用STS Token访问", |
|||
"DisplayName:RamRoleArn": "角色全局资源描述符", |
|||
"Description:RamRoleArn": "格式:acs:ram::$accountID:role/$roleName/$RoleSessionName,详情见阿里云访问控制API", |
|||
"DisplayName:RoleSessionName": "角色的临时身份", |
|||
"Description:RoleSessionName": "此参数用来区分不同的令牌,可用于用户级别的访问审计", |
|||
"DisplayName:DurationSeconds": "过期时间,单位为秒。", |
|||
"Description:DurationSeconds": "过期时间最小值为900秒,默认3600秒", |
|||
"DisplayName:Policy": "权限策略", |
|||
"Description:Policy": "生成STS Token时可以指定一个额外的权限策略,以进一步限制STS Token的权限" |
|||
} |
|||
} |
|||
@ -0,0 +1,81 @@ |
|||
using LINYUN.Abp.Aliyun.Localization; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINYUN.Abp.Aliyun.Settings |
|||
{ |
|||
public class AliyunSettingProvider : SettingDefinitionProvider |
|||
{ |
|||
public override void Define(ISettingDefinitionContext context) |
|||
{ |
|||
context.Add(CreateAliyunSettings()); |
|||
} |
|||
|
|||
private SettingDefinition[] CreateAliyunSettings() |
|||
{ |
|||
return new SettingDefinition[] |
|||
{ |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.AccessKeyId, |
|||
displayName: L("DisplayName:AccessKeyId"), |
|||
description: L("Description:AccessKeyId"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.AccessKeySecret, |
|||
displayName: L("DisplayName:AccessKeySecret"), |
|||
description: L("Description:AccessKeySecret"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.DurationSeconds, |
|||
defaultValue: "3000", |
|||
displayName: L("DisplayName:DurationSeconds"), |
|||
description: L("Description:DurationSeconds"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.Policy, |
|||
displayName: L("DisplayName:Policy"), |
|||
description: L("Description:Policy"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.RamRoleArn, |
|||
displayName: L("DisplayName:RamRoleArn"), |
|||
description: L("Description:RamRoleArn"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.RegionId, |
|||
displayName: L("DisplayName:RegionId"), |
|||
description: L("Description:RegionId"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.RoleSessionName, |
|||
displayName: L("DisplayName:RoleSessionName"), |
|||
description: L("Description:RoleSessionName"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSettingNames.Authorization.UseSecurityTokenService, |
|||
defaultValue: true.ToString(), |
|||
displayName: L("DisplayName:UseSecurityTokenService"), |
|||
description: L("Description:UseSecurityTokenService"), |
|||
isVisibleToClients: false |
|||
), |
|||
}; |
|||
} |
|||
|
|||
private ILocalizableString L(string name) |
|||
{ |
|||
return LocalizableString.Create<AliyunResource>(name); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
# LINGYUN.Abp.Aliyun |
|||
|
|||
阿里云sdk集成 |
|||
|
|||
参照:https://help.aliyun.com/document_detail/28763.html |
|||
|
|||
## 配置使用 |
|||
|
|||
模块按需引用 |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpAliyunModule))] |
|||
public class YouProjectModule : AbpModule |
|||
{ |
|||
// other |
|||
} |
|||
``` |
|||
## 配置项说明 |
|||
|
|||
* AliyunSettingNames.Authorization.RegionId 可选,区域,默认 default |
|||
* AliyunSettingNames.Authorization.AccessKeyId 必须,阿里云RAM账号的AccessKey ID |
|||
* AliyunSettingNames.Authorization.AccessKeySecret 必须,RAM账号的AccessKey Secret |
|||
* AliyunSettingNames.Authorization.UseSecurityTokenService 可选,建议,使用STS Token访问,按照阿里云文档,建议使用Sts Token访问API,默认false |
|||
* AliyunSettingNames.Authorization.RamRoleArn 可选,启用Sts Token之后必须配置,阿里云RAM角色ARN |
|||
* AliyunSettingNames.Authorization.RoleSessionName 可选,启用Sts Token之后的用户自定义令牌名称,用于访问审计 |
|||
* AliyunSettingNames.Authorization.DurationSeconds 可选,用户令牌的过期时间,单位为秒,默认3000 |
|||
* AliyunSettingNames.Authorization.Policy 可选,权限策略,为json字符串 |
|||
|
|||
## 其他 |
|||
|
|||
网络因素在高并发下可能会出现预期外的异常,考虑使用二级缓存 |
|||
@ -0,0 +1,15 @@ |
|||
using Aliyun.OSS; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace LINGYUN.Abp.BlobStoring.Aliyun |
|||
{ |
|||
public interface IOssClientFactory |
|||
{ |
|||
/// <summary>
|
|||
/// 通过配置信息构建Oss客户端调用
|
|||
/// </summary>
|
|||
/// <param name="configuration"></param>
|
|||
/// <returns></returns>
|
|||
Task<IOss> CreateAsync(AliyunBlobProviderConfiguration configuration); |
|||
} |
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
using Aliyun.OSS; |
|||
using LINYUN.Abp.Aliyun; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINGYUN.Abp.BlobStoring.Aliyun |
|||
{ |
|||
public class OssClientFactory : AliyunClientFactory<IOss, AliyunBlobProviderConfiguration>, IOssClientFactory, ITransientDependency |
|||
{ |
|||
public OssClientFactory( |
|||
ISettingProvider settingProvider, |
|||
IDistributedCache<AliyunBasicSessionCredentialsCacheItem> cache) |
|||
: base(settingProvider, cache) |
|||
{ |
|||
} |
|||
/// <summary>
|
|||
/// 普通方式构建Oss客户端
|
|||
/// </summary>
|
|||
/// <param name="configuration"></param>
|
|||
/// <param name="regionId"></param>
|
|||
/// <param name="accessKeyId"></param>
|
|||
/// <param name="accessKeySecret"></param>
|
|||
/// <returns></returns>
|
|||
protected override IOss GetClient(AliyunBlobProviderConfiguration configuration, string regionId, string accessKeyId, string accessKeySecret) |
|||
{ |
|||
return new OssClient( |
|||
configuration.Endpoint, |
|||
accessKeyId, |
|||
accessKeySecret); |
|||
} |
|||
/// <summary>
|
|||
/// 通过用户安全令牌构建Oss客户端
|
|||
/// </summary>
|
|||
/// <param name="configuration"></param>
|
|||
/// <param name="regionId"></param>
|
|||
/// <param name="accessKeyId"></param>
|
|||
/// <param name="accessKeySecret"></param>
|
|||
/// <param name="securityToken"></param>
|
|||
/// <returns></returns>
|
|||
protected override IOss GetSecurityTokenClient(AliyunBlobProviderConfiguration configuration, string regionId, string accessKeyId, string accessKeySecret, string securityToken) |
|||
{ |
|||
return new OssClient( |
|||
configuration.Endpoint, |
|||
accessKeyId, |
|||
accessKeySecret, |
|||
securityToken); |
|||
} |
|||
} |
|||
} |
|||
@ -1,28 +1,12 @@ |
|||
using Microsoft.Extensions.Logging; |
|||
using Volo.Abp; |
|||
using Volo.Abp.ExceptionHandling; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Logging; |
|||
using LINYUN.Abp.Aliyun; |
|||
|
|||
namespace LINYUN.Abp.Sms.Aliyun |
|||
{ |
|||
public class AliyunSmsException : AbpException, IHasErrorCode, ILocalizeErrorMessage, IHasLogLevel |
|||
public class AliyunSmsException : AbpAliyunException |
|||
{ |
|||
public AliyunSmsException(string code, string message) |
|||
:base(message) |
|||
:base(code, message) |
|||
{ |
|||
Code = code; |
|||
LogLevel = LogLevel.Warning; |
|||
} |
|||
|
|||
public LogLevel LogLevel { get; set; } |
|||
|
|||
public string Code { get; } |
|||
|
|||
public string LocalizeMessage(LocalizationContext context) |
|||
{ |
|||
return AliyunSmsResponse.GetErrorMessage(Code, Message) |
|||
.Localize(context.LocalizerFactory); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -1,38 +0,0 @@ |
|||
namespace LINYUN.Abp.Sms.Aliyun |
|||
{ |
|||
public class AliyunSmsOptions |
|||
{ |
|||
/// <summary>
|
|||
/// 区域Id
|
|||
/// </summary>
|
|||
public string RegionId { get; set; } = "default"; |
|||
/// <summary>
|
|||
/// 阿里云sms服务域名
|
|||
/// </summary>
|
|||
public string Domain { get; set; } = "dysmsapi.aliyuncs.com"; |
|||
/// <summary>
|
|||
/// 调用方法名称
|
|||
/// </summary>
|
|||
public string ActionName { get; set; } = "SendSms"; |
|||
/// <summary>
|
|||
/// 默认版本号
|
|||
/// </summary>
|
|||
public string Version { get; set; } = "2017-05-25"; |
|||
/// <summary>
|
|||
/// 默认签名
|
|||
/// </summary>
|
|||
public string DefaultSignName { get; set; } |
|||
/// <summary>
|
|||
/// 默认短信模板号
|
|||
/// </summary>
|
|||
public string DefaultTemplateCode { get; set; } |
|||
/// <summary>
|
|||
/// 开发人员号码,当应用处于开发模式时,默认所有信息都会发送到此号码
|
|||
/// </summary>
|
|||
public string DeveloperPhoneNumber { get; set; } = "13800138000"; |
|||
/// <summary>
|
|||
/// 展示错误给客户端
|
|||
/// </summary>
|
|||
public bool VisableErrorToClient { get; set; } = false; |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
using LINYUN.Abp.Aliyun.Settings; |
|||
|
|||
namespace LINYUN.Abp.Sms.Aliyun.Settings |
|||
{ |
|||
public static class AliyunSmsSettingNames |
|||
{ |
|||
/// <summary>
|
|||
/// 短信服务
|
|||
/// </summary>
|
|||
public class Sms |
|||
{ |
|||
public const string Prefix = AliyunSettingNames.Prefix + ".Sms"; |
|||
/// <summary>
|
|||
/// 阿里云sms服务域名
|
|||
/// </summary>
|
|||
public const string Domain = Prefix + ".Domain"; |
|||
/// <summary>
|
|||
/// 调用方法名称
|
|||
/// </summary>
|
|||
public const string ActionName = Prefix + ".ActionName"; |
|||
/// <summary>
|
|||
/// 默认版本号
|
|||
/// </summary>
|
|||
public const string Version = Prefix + ".Version"; |
|||
/// <summary>
|
|||
/// 默认签名
|
|||
/// </summary>
|
|||
public const string DefaultSignName = Prefix + ".DefaultSignName"; |
|||
/// <summary>
|
|||
/// 默认短信模板号
|
|||
/// </summary>
|
|||
public const string DefaultTemplateCode = Prefix + ".DefaultTemplateCode"; |
|||
/// <summary>
|
|||
/// 默认号码
|
|||
/// </summary>
|
|||
public const string DefaultPhoneNumber = Prefix + ".DefaultPhoneNumber"; |
|||
/// <summary>
|
|||
/// 展示错误给客户端
|
|||
/// </summary>
|
|||
public const string VisableErrorToClient = Prefix + ".VisableErrorToClient"; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,74 @@ |
|||
using LINYUN.Abp.Aliyun.Localization; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINYUN.Abp.Sms.Aliyun.Settings |
|||
{ |
|||
public class AliyunSmsSettingProvider : SettingDefinitionProvider |
|||
{ |
|||
public override void Define(ISettingDefinitionContext context) |
|||
{ |
|||
context.Add(CreateAliyunSettings()); |
|||
} |
|||
|
|||
private SettingDefinition[] CreateAliyunSettings() |
|||
{ |
|||
return new SettingDefinition[] |
|||
{ |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.ActionName, |
|||
defaultValue: "SendSms", |
|||
displayName: L("DisplayName:ActionName"), |
|||
description: L("Description:ActionName"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.DefaultSignName, |
|||
displayName: L("DisplayName:DefaultSignName"), |
|||
description: L("Description:DefaultSignName"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.DefaultTemplateCode, |
|||
displayName: L("DisplayName:DefaultTemplateCode"), |
|||
description: L("Description:DefaultTemplateCode"), |
|||
isVisibleToClients: false, |
|||
isEncrypted: true |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.DefaultPhoneNumber, |
|||
displayName: L("DisplayName:DefaultPhoneNumber"), |
|||
description: L("Description:DefaultPhoneNumber"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.Domain, |
|||
defaultValue: "dysmsapi.aliyuncs.com", |
|||
displayName: L("DisplayName:Domain"), |
|||
description: L("Description:Domain"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.Version, |
|||
defaultValue: "2017-05-25", |
|||
displayName: L("DisplayName:Version"), |
|||
description: L("Description:Version"), |
|||
isVisibleToClients: false |
|||
), |
|||
new SettingDefinition( |
|||
AliyunSmsSettingNames.Sms.VisableErrorToClient, |
|||
defaultValue: false.ToString(), |
|||
displayName: L("DisplayName:VisableErrorToClient"), |
|||
description: L("Description:VisableErrorToClient"), |
|||
isVisibleToClients: false |
|||
) |
|||
}; |
|||
} |
|||
|
|||
private ILocalizableString L(string name) |
|||
{ |
|||
return LocalizableString.Create<AliyunResource>(name); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.Security; |
|||
|
|||
namespace LINGYUN.Abp.Encryption.Console |
|||
{ |
|||
[DependsOn( |
|||
typeof(AbpSecurityModule))] |
|||
public class AbpEncryptionConsoleModule : AbpModule |
|||
{ |
|||
|
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<OutputType>Exe</OutputType> |
|||
<TargetFramework>netcoreapp3.1</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Volo.Abp.Security" Version="4.2.1" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,42 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using System; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Security.Encryption; |
|||
using static System.Console; |
|||
|
|||
namespace LINGYUN.Abp.Encryption.Console |
|||
{ |
|||
class Program |
|||
{ |
|||
static void Main(string[] args) |
|||
{ |
|||
WriteLine("Hello World!"); |
|||
|
|||
var application = AbpApplicationFactory.Create<AbpEncryptionConsoleModule>(); |
|||
|
|||
application.Initialize(); |
|||
|
|||
WriteLine("D:解密 E:加密"); |
|||
|
|||
var opt = ReadLine(); |
|||
bool en = false; |
|||
if ("E".Equals(opt, StringComparison.InvariantCultureIgnoreCase)) |
|||
{ |
|||
en = true; |
|||
WriteLine("请输入需要加密的字符串"); |
|||
} |
|||
else |
|||
{ |
|||
WriteLine("请输入需要解密的字符串"); |
|||
} |
|||
|
|||
var sourceChr = ReadLine(); |
|||
var encryptionService = application.ServiceProvider.GetRequiredService<IStringEncryptionService>(); |
|||
WriteLine(en ? encryptionService.Encrypt(sourceChr) : encryptionService.Decrypt(sourceChr)); |
|||
|
|||
application.Shutdown(); |
|||
|
|||
ReadKey(); |
|||
} |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue