6 changed files with 572 additions and 316 deletions
@ -1,309 +0,0 @@ |
|||||
using Microsoft.Extensions.Configuration; |
|
||||
using OpenIddict.Abstractions; |
|
||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Globalization; |
|
||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.Authorization.Permissions; |
|
||||
using Volo.Abp.Data; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
using Volo.Abp.MultiTenancy; |
|
||||
using Volo.Abp.OpenIddict.Applications; |
|
||||
using Volo.Abp.OpenIddict.Scopes; |
|
||||
using Volo.Abp.PermissionManagement; |
|
||||
|
|
||||
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeder; |
|
||||
|
|
||||
public class AuthServerDataSeedContributor : IDataSeedContributor, ITransientDependency |
|
||||
{ |
|
||||
public static HashSet<string> InitializeScopes = new HashSet<string> |
|
||||
{ |
|
||||
// obsolete! microservice should be allocated separately
|
|
||||
"lingyun-abp-application", |
|
||||
// admin service
|
|
||||
"ams", |
|
||||
// identity service
|
|
||||
"ids", |
|
||||
// localization service
|
|
||||
"lts", |
|
||||
// platform service
|
|
||||
"pts", |
|
||||
// message service
|
|
||||
"mgs", |
|
||||
// task service
|
|
||||
"tks", |
|
||||
// webhook service
|
|
||||
"wks", |
|
||||
// workflow service
|
|
||||
"wfs", |
|
||||
// wechat service
|
|
||||
"was" |
|
||||
}; |
|
||||
|
|
||||
private readonly IConfiguration _configuration; |
|
||||
private readonly ICurrentTenant _currentTenant; |
|
||||
private readonly IOpenIddictApplicationManager _applicationManager; |
|
||||
private readonly IOpenIddictApplicationRepository _applicationRepository; |
|
||||
|
|
||||
private readonly IPermissionDataSeeder _permissionDataSeeder; |
|
||||
|
|
||||
private readonly IOpenIddictScopeManager _scopeManager; |
|
||||
private readonly IOpenIddictScopeRepository _scopeRepository; |
|
||||
|
|
||||
public AuthServerDataSeedContributor( |
|
||||
IConfiguration configuration, |
|
||||
ICurrentTenant currentTenant, |
|
||||
IOpenIddictScopeManager scopeManager, |
|
||||
IOpenIddictScopeRepository scopeRepository, |
|
||||
IPermissionDataSeeder permissionDataSeeder, |
|
||||
IOpenIddictApplicationManager applicationManager, |
|
||||
IOpenIddictApplicationRepository applicationRepository) |
|
||||
{ |
|
||||
_configuration = configuration; |
|
||||
_currentTenant = currentTenant; |
|
||||
_scopeManager = scopeManager; |
|
||||
_scopeRepository = scopeRepository; |
|
||||
_permissionDataSeeder = permissionDataSeeder; |
|
||||
_applicationManager = applicationManager; |
|
||||
_applicationRepository = applicationRepository; |
|
||||
} |
|
||||
|
|
||||
public async Task SeedAsync(DataSeedContext context) |
|
||||
{ |
|
||||
using (_currentTenant.Change(context.TenantId)) |
|
||||
{ |
|
||||
await CreateScopeAsync(InitializeScopes); |
|
||||
|
|
||||
await CreateApplicationAsync(InitializeScopes); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private async Task CreateScopeAsync(IEnumerable<string> scopes) |
|
||||
{ |
|
||||
foreach (var scope in scopes) |
|
||||
{ |
|
||||
if (await _scopeRepository.FindByNameAsync(scope) == null) |
|
||||
{ |
|
||||
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() |
|
||||
{ |
|
||||
Name = scope, |
|
||||
DisplayName = scope + " access", |
|
||||
DisplayNames = |
|
||||
{ |
|
||||
[CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问", |
|
||||
[CultureInfo.GetCultureInfo("en")] = "Abp API Application Access" |
|
||||
}, |
|
||||
Resources = |
|
||||
{ |
|
||||
scope |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private async Task CreateApplicationAsync(IEnumerable<string> scopes) |
|
||||
{ |
|
||||
var configurationSection = _configuration.GetSection("OpenIddict:Applications"); |
|
||||
|
|
||||
var vueClientId = configurationSection["VueAdmin:ClientId"]; |
|
||||
if (!vueClientId.IsNullOrWhiteSpace()) |
|
||||
{ |
|
||||
var vueClientRootUrl = configurationSection["VueAdmin:RootUrl"].EnsureEndsWith('/'); |
|
||||
|
|
||||
if (await _applicationRepository.FindByClientIdAsync(vueClientId) == null) |
|
||||
{ |
|
||||
var application = new OpenIddictApplicationDescriptor |
|
||||
{ |
|
||||
ClientId = vueClientId, |
|
||||
ClientSecret = configurationSection["VueAdmin:ClientSecret"], |
|
||||
ApplicationType = OpenIddictConstants.ApplicationTypes.Web, |
|
||||
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, |
|
||||
DisplayName = "Abp Vue Admin Client", |
|
||||
PostLogoutRedirectUris = |
|
||||
{ |
|
||||
new Uri(vueClientRootUrl + "signout-callback"), |
|
||||
new Uri(vueClientRootUrl) |
|
||||
}, |
|
||||
RedirectUris = |
|
||||
{ |
|
||||
new Uri(vueClientRootUrl + "signin-callback"), |
|
||||
new Uri(vueClientRootUrl) |
|
||||
}, |
|
||||
Permissions = |
|
||||
{ |
|
||||
OpenIddictConstants.Permissions.Endpoints.Authorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Token, |
|
||||
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Introspection, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Revocation, |
|
||||
OpenIddictConstants.Permissions.Endpoints.EndSession, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.Implicit, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.Password, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.RefreshToken, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.DeviceCode, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Code, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.None, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Token, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.Scopes.Roles, |
|
||||
OpenIddictConstants.Permissions.Scopes.Profile, |
|
||||
OpenIddictConstants.Permissions.Scopes.Email, |
|
||||
OpenIddictConstants.Permissions.Scopes.Address, |
|
||||
OpenIddictConstants.Permissions.Scopes.Phone, |
|
||||
} |
|
||||
}; |
|
||||
foreach (var scope in scopes) |
|
||||
{ |
|
||||
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope); |
|
||||
} |
|
||||
|
|
||||
await _applicationManager.CreateAsync(application); |
|
||||
|
|
||||
var vueClientPermissions = new string[1] |
|
||||
{ |
|
||||
"AbpIdentity.UserLookup" |
|
||||
}; |
|
||||
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
var internalServiceClientId = configurationSection["InternalService:ClientId"]; |
|
||||
if (!internalServiceClientId.IsNullOrWhiteSpace()) |
|
||||
{ |
|
||||
if (await _applicationRepository.FindByClientIdAsync(internalServiceClientId) == null) |
|
||||
{ |
|
||||
var application = new OpenIddictApplicationDescriptor |
|
||||
{ |
|
||||
ClientId = internalServiceClientId, |
|
||||
ClientSecret = configurationSection["InternalService:ClientSecret"], |
|
||||
ClientType = OpenIddictConstants.ClientTypes.Confidential, |
|
||||
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, |
|
||||
ApplicationType = OpenIddictConstants.ApplicationTypes.Native, |
|
||||
DisplayName = "Abp Vue Admin Client", |
|
||||
Permissions = |
|
||||
{ |
|
||||
OpenIddictConstants.Permissions.Endpoints.Authorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Token, |
|
||||
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Introspection, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Revocation, |
|
||||
OpenIddictConstants.Permissions.Endpoints.EndSession, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.Implicit, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.Password, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.RefreshToken, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.DeviceCode, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Code, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.None, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Token, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.Scopes.Roles, |
|
||||
OpenIddictConstants.Permissions.Scopes.Profile, |
|
||||
OpenIddictConstants.Permissions.Scopes.Email, |
|
||||
OpenIddictConstants.Permissions.Scopes.Address, |
|
||||
OpenIddictConstants.Permissions.Scopes.Phone, |
|
||||
} |
|
||||
}; |
|
||||
foreach (var scope in scopes) |
|
||||
{ |
|
||||
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope); |
|
||||
} |
|
||||
|
|
||||
await _applicationManager.CreateAsync(application); |
|
||||
|
|
||||
var internalServicePermissions = new string[2] |
|
||||
{ |
|
||||
"AbpIdentity.UserLookup","AbpIdentity.Users" |
|
||||
}; |
|
||||
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, internalServiceClientId, internalServicePermissions); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
var oauthClientId = configurationSection["VueOAuthClient:ClientId"]; |
|
||||
if (!oauthClientId.IsNullOrWhiteSpace()) |
|
||||
{ |
|
||||
var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>(); |
|
||||
|
|
||||
if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null) |
|
||||
{ |
|
||||
var application = new OpenIddictApplicationDescriptor |
|
||||
{ |
|
||||
ClientId = oauthClientId, |
|
||||
ClientSecret = null, |
|
||||
ApplicationType = OpenIddictConstants.ApplicationTypes.Web, |
|
||||
ConsentType = OpenIddictConstants.ConsentTypes.Implicit, |
|
||||
DisplayName = "OAuth Client", |
|
||||
PostLogoutRedirectUris = { }, |
|
||||
RedirectUris = { }, |
|
||||
Permissions = |
|
||||
{ |
|
||||
OpenIddictConstants.Permissions.Endpoints.Authorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Token, |
|
||||
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Introspection, |
|
||||
OpenIddictConstants.Permissions.Endpoints.Revocation, |
|
||||
OpenIddictConstants.Permissions.Endpoints.EndSession, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, |
|
||||
OpenIddictConstants.Permissions.GrantTypes.RefreshToken, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Code, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.CodeToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.None, |
|
||||
OpenIddictConstants.Permissions.ResponseTypes.Token, |
|
||||
|
|
||||
OpenIddictConstants.Permissions.Scopes.Roles, |
|
||||
OpenIddictConstants.Permissions.Scopes.Profile, |
|
||||
OpenIddictConstants.Permissions.Scopes.Email, |
|
||||
OpenIddictConstants.Permissions.Scopes.Address, |
|
||||
OpenIddictConstants.Permissions.Scopes.Phone, |
|
||||
} |
|
||||
}; |
|
||||
foreach (var scope in scopes) |
|
||||
{ |
|
||||
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope); |
|
||||
} |
|
||||
|
|
||||
oauthClientRootUrls.ForEach(url => |
|
||||
{ |
|
||||
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/'))); |
|
||||
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signout-callback")); |
|
||||
|
|
||||
application.RedirectUris.AddIfNotContains(new Uri(url)); |
|
||||
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signin-callback")); |
|
||||
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html")); |
|
||||
}); |
|
||||
|
|
||||
await _applicationManager.CreateAsync(application); |
|
||||
|
|
||||
var oauthClientPermissions = new string[1] |
|
||||
{ |
|
||||
"AbpIdentity.UserLookup" |
|
||||
}; |
|
||||
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, oauthClientId, oauthClientPermissions); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,330 @@ |
|||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using OpenIddict.Abstractions; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Globalization; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Authorization.Permissions; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.OpenIddict; |
||||
|
using Volo.Abp.OpenIddict.Applications; |
||||
|
using Volo.Abp.OpenIddict.Scopes; |
||||
|
using Volo.Abp.PermissionManagement; |
||||
|
|
||||
|
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeder; |
||||
|
|
||||
|
public class OpenIddictDataSeederContributor : OpenIddictDataSeedContributorBase, IDataSeedContributor, ITransientDependency |
||||
|
{ |
||||
|
public ILogger<OpenIddictDataSeederContributor> Logger { protected get; set; } |
||||
|
protected IPermissionDataSeeder PermissionDataSeeder { get; } |
||||
|
public OpenIddictDataSeederContributor( |
||||
|
IConfiguration configuration, |
||||
|
IOpenIddictApplicationRepository openIddictApplicationRepository, |
||||
|
IAbpApplicationManager applicationManager, |
||||
|
IOpenIddictScopeRepository openIddictScopeRepository, |
||||
|
IOpenIddictScopeManager scopeManager, |
||||
|
IPermissionDataSeeder permissionDataSeeder) |
||||
|
: base(configuration, openIddictApplicationRepository, applicationManager, openIddictScopeRepository, scopeManager) |
||||
|
{ |
||||
|
PermissionDataSeeder = permissionDataSeeder; |
||||
|
|
||||
|
Logger = NullLogger<OpenIddictDataSeederContributor>.Instance; |
||||
|
} |
||||
|
|
||||
|
public async virtual Task SeedAsync(DataSeedContext context) |
||||
|
{ |
||||
|
if (context.TenantId.HasValue) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
var scope = "lingyun-abp-application"; |
||||
|
|
||||
|
Logger.LogInformation("Seeding the default scope..."); |
||||
|
await CreateDefaultScopeAsync(); |
||||
|
await CreateApiScopeAsync(scope); |
||||
|
|
||||
|
Logger.LogInformation("Seeding the default applications..."); |
||||
|
await CreateApplicationAsync(scope); |
||||
|
|
||||
|
Logger.LogInformation("Seeding default applications completed."); |
||||
|
} |
||||
|
|
||||
|
private async Task CreateDefaultScopeAsync() |
||||
|
{ |
||||
|
// OpenID Connect核心scope - 用于标识这是一个OIDC请求
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.OpenId, |
||||
|
DisplayName = "OpenID Connect", // 友好的显示名称
|
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "身份认证", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "OpenID Connect" |
||||
|
}, |
||||
|
Description = "使用OpenID Connect协议进行身份验证", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序使用您的身份信息进行登录", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to authenticate you using OpenID Connect" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Profile scope - 用户基本信息
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.Profile, |
||||
|
DisplayName = "个人资料", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "个人资料", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Profile" |
||||
|
}, |
||||
|
Description = "访问您的基本个人资料信息", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的姓名、头像等基本信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your basic profile information like name and picture" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Email scope
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.Email, |
||||
|
DisplayName = "电子邮件", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "电子邮件", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Email" |
||||
|
}, |
||||
|
Description = "访问您的电子邮件地址", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的电子邮件地址", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your email address" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Phone scope
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.Phone, |
||||
|
DisplayName = "电话号码", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "电话号码", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Phone" |
||||
|
}, |
||||
|
Description = "访问您的电话号码", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的电话号码", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your phone number" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Address scope
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.Address, |
||||
|
DisplayName = "地址信息", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "地址信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Address" |
||||
|
}, |
||||
|
Description = "访问您的地址信息", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的地址信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your address information" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Roles scope
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.Roles, |
||||
|
DisplayName = "角色信息", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "角色信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Roles" |
||||
|
}, |
||||
|
Description = "访问您的角色信息", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的角色和权限信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your roles and permissions" |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// Offline Access scope - 用于获取刷新令牌
|
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = OpenIddictConstants.Scopes.OfflineAccess, |
||||
|
DisplayName = "离线访问", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "离线访问", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Offline Access" |
||||
|
}, |
||||
|
Description = "在您未登录时访问您的信息", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序在您未登录时访问您的信息", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your information while you are offline" |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private async Task CreateApiScopeAsync(string scope) |
||||
|
{ |
||||
|
await CreateScopesAsync(new OpenIddictScopeDescriptor |
||||
|
{ |
||||
|
Name = scope, |
||||
|
DisplayName = "微服务访问授权", |
||||
|
DisplayNames = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "微服务访问授权", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Single Applications" |
||||
|
}, |
||||
|
Description = "适用于微服务体系的接口授权", |
||||
|
Descriptions = |
||||
|
{ |
||||
|
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序使用各微服务模块的接口", |
||||
|
[CultureInfo.GetCultureInfo("en")] = "Allow the application to use the interfaces of each microservice module" |
||||
|
}, |
||||
|
Resources = |
||||
|
{ |
||||
|
"api-gateway", |
||||
|
"auth-server", |
||||
|
"admin-service", |
||||
|
"identity-service", |
||||
|
"localization-service", |
||||
|
"message-service", |
||||
|
"platform-service", |
||||
|
"task-service", |
||||
|
"webhook-service", |
||||
|
"wechat-service", |
||||
|
"workflow-service", |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
private async Task CreateApplicationAsync(string scope) |
||||
|
{ |
||||
|
var configurationSection = Configuration.GetSection("OpenIddict:Applications"); |
||||
|
var vueClientId = configurationSection["VueAdmin:ClientId"]; |
||||
|
if (!vueClientId.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
Logger.LogInformation("Seeding application {vueClientId}...", vueClientId); |
||||
|
|
||||
|
var vueClientRootUrls = configurationSection.GetSection("VueAdmin:RootUrls").Get<List<string>>() ?? []; |
||||
|
|
||||
|
var vueClientRedirectUrls = new List<string>(); |
||||
|
var vueClientPostLogoutRedirectUrls = new List<string>(); |
||||
|
vueClientRootUrls.ForEach(url => |
||||
|
{ |
||||
|
vueClientRedirectUrls.Add(url.EnsureEndsWith('/')); |
||||
|
vueClientRedirectUrls.Add(url.EnsureEndsWith('/') + "signin-callback"); |
||||
|
|
||||
|
vueClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/')); |
||||
|
vueClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/') + "signout-callback"); |
||||
|
}); |
||||
|
|
||||
|
await CreateOrUpdateApplicationAsync( |
||||
|
OpenIddictConstants.ApplicationTypes.Web, |
||||
|
vueClientId, |
||||
|
OpenIddictConstants.ClientTypes.Confidential, |
||||
|
OpenIddictConstants.ConsentTypes.Explicit, |
||||
|
"Abp Vue Admin Client", |
||||
|
configurationSection["VueAdmin:ClientSecret"] ?? "1q2w3e*", |
||||
|
[OpenIddictConstants.GrantTypes.AuthorizationCode, |
||||
|
OpenIddictConstants.GrantTypes.Implicit, |
||||
|
OpenIddictConstants.GrantTypes.Password, |
||||
|
OpenIddictConstants.GrantTypes.RefreshToken], |
||||
|
[OpenIddictConstants.Scopes.OpenId, |
||||
|
OpenIddictConstants.Scopes.Email, |
||||
|
OpenIddictConstants.Scopes.Roles, |
||||
|
OpenIddictConstants.Scopes.Address, |
||||
|
OpenIddictConstants.Scopes.Phone, |
||||
|
OpenIddictConstants.Scopes.Profile, |
||||
|
OpenIddictConstants.Scopes.OfflineAccess, |
||||
|
scope], |
||||
|
vueClientRedirectUrls, |
||||
|
vueClientPostLogoutRedirectUrls); |
||||
|
|
||||
|
var vueClientPermissions = new string[1] |
||||
|
{ |
||||
|
"AbpIdentity.UserLookup" |
||||
|
}; |
||||
|
await PermissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions); |
||||
|
} |
||||
|
|
||||
|
var internalServiceClientId = configurationSection["InternalService:ClientId"]; |
||||
|
if (!internalServiceClientId.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
Logger.LogInformation("Seeding application {internalServiceClientId}...", internalServiceClientId); |
||||
|
|
||||
|
await CreateOrUpdateApplicationAsync( |
||||
|
OpenIddictConstants.ApplicationTypes.Native, |
||||
|
internalServiceClientId, |
||||
|
OpenIddictConstants.ClientTypes.Confidential, |
||||
|
OpenIddictConstants.ConsentTypes.Explicit, |
||||
|
"Abp Internal Service Client", |
||||
|
configurationSection["InternalService:ClientSecret"] ?? "1q2w3e*", |
||||
|
[OpenIddictConstants.GrantTypes.ClientCredentials], |
||||
|
[OpenIddictConstants.ResponseTypes.Token, scope]); |
||||
|
} |
||||
|
|
||||
|
var oauthClientId = configurationSection["VueOAuthClient:ClientId"]; |
||||
|
if (!oauthClientId.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
Logger.LogInformation("Seeding application {oauthClientId}...", oauthClientId); |
||||
|
|
||||
|
var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>() ?? []; |
||||
|
|
||||
|
var oauthClientRedirectUrls = new List<string>(); |
||||
|
var oauthClientPostLogoutRedirectUrls = new List<string>(); |
||||
|
oauthClientRootUrls.ForEach(url => |
||||
|
{ |
||||
|
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/')); |
||||
|
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/') + "signin-callback"); |
||||
|
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html"); |
||||
|
|
||||
|
oauthClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/')); |
||||
|
oauthClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/') + "signout-callback"); |
||||
|
}); |
||||
|
|
||||
|
await CreateOrUpdateApplicationAsync( |
||||
|
OpenIddictConstants.ApplicationTypes.Web, |
||||
|
oauthClientId, |
||||
|
OpenIddictConstants.ClientTypes.Public, |
||||
|
OpenIddictConstants.ConsentTypes.Implicit, |
||||
|
"Abp OAuth Client", |
||||
|
null, |
||||
|
[OpenIddictConstants.GrantTypes.AuthorizationCode, |
||||
|
OpenIddictConstants.GrantTypes.RefreshToken], |
||||
|
[OpenIddictConstants.Scopes.OpenId, |
||||
|
OpenIddictConstants.Scopes.Email, |
||||
|
OpenIddictConstants.Scopes.Roles, |
||||
|
OpenIddictConstants.Scopes.Address, |
||||
|
OpenIddictConstants.Scopes.Phone, |
||||
|
OpenIddictConstants.Scopes.Profile, |
||||
|
OpenIddictConstants.Scopes.OfflineAccess, |
||||
|
scope], |
||||
|
oauthClientRedirectUrls, |
||||
|
oauthClientPostLogoutRedirectUrls); |
||||
|
|
||||
|
var oauthClientPermissions = new string[1] |
||||
|
{ |
||||
|
"AbpIdentity.UserLookup" |
||||
|
}; |
||||
|
await PermissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, oauthClientId, oauthClientPermissions); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,89 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using OpenIddict.Abstractions; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Guids; |
||||
|
using Volo.Abp.Identity; |
||||
|
|
||||
|
namespace LY.MicroService.Applications.Single.EntityFrameworkCore.DataSeeder; |
||||
|
public class IdentityClaimTypeDataSeedContributor : IDataSeedContributor, ITransientDependency |
||||
|
{ |
||||
|
public ILogger<IdentityClaimTypeDataSeedContributor> Logger { protected get; set; } |
||||
|
|
||||
|
protected IGuidGenerator GuidGenerator { get; } |
||||
|
protected IdentityClaimTypeManager IdentityClaimTypeManager { get; } |
||||
|
protected IIdentityClaimTypeRepository IdentityClaimTypeRepository { get; } |
||||
|
public IdentityClaimTypeDataSeedContributor( |
||||
|
IGuidGenerator guidGenerator, |
||||
|
IdentityClaimTypeManager identityClaimTypeManager, |
||||
|
IIdentityClaimTypeRepository identityClaimTypeRepository) |
||||
|
{ |
||||
|
GuidGenerator = guidGenerator; |
||||
|
IdentityClaimTypeManager = identityClaimTypeManager; |
||||
|
IdentityClaimTypeRepository = identityClaimTypeRepository; |
||||
|
} |
||||
|
|
||||
|
public async virtual Task SeedAsync(DataSeedContext context) |
||||
|
{ |
||||
|
if (context.TenantId.HasValue) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
Logger.LogInformation("Seeding the default identity claim types..."); |
||||
|
|
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Address); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Birthdate, valueType: IdentityClaimValueType.DateTime); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Country); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Email); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.EmailVerified, valueType: IdentityClaimValueType.Boolean); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.FamilyName); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Gender); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.GivenName); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Locale); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Locality); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.MiddleName); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Name); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Nickname); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PhoneNumber); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PhoneNumberVerified, valueType: IdentityClaimValueType.Boolean); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Picture); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PostalCode); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PreferredUsername); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Profile); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Region); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Role); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.StreetAddress); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Username); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Website); |
||||
|
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Zoneinfo); |
||||
|
|
||||
|
Logger.LogInformation("Seeding default identity claim types completed."); |
||||
|
} |
||||
|
|
||||
|
private async Task CreateIdentityClaimTypeAsync( |
||||
|
[NotNull] string name, |
||||
|
bool required = false, |
||||
|
bool isStatic = false, |
||||
|
[CanBeNull] string regex = null, |
||||
|
[CanBeNull] string regexDescription = null, |
||||
|
[CanBeNull] string description = null, |
||||
|
IdentityClaimValueType valueType = IdentityClaimValueType.String) |
||||
|
{ |
||||
|
if (!await IdentityClaimTypeRepository.AnyAsync(name)) |
||||
|
{ |
||||
|
await IdentityClaimTypeManager.CreateAsync( |
||||
|
new IdentityClaimType( |
||||
|
GuidGenerator.Create(), |
||||
|
name, |
||||
|
required, |
||||
|
isStatic, |
||||
|
regex, |
||||
|
regexDescription, |
||||
|
description, |
||||
|
valueType)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue