临河任务调度
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

375 lignes
15KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using JetBrains.Annotations;
  6. using Microsoft.Extensions.Configuration;
  7. using Microsoft.Extensions.Localization;
  8. using OpenIddict.Abstractions;
  9. using Volo.Abp;
  10. using Volo.Abp.Authorization.Permissions;
  11. using Volo.Abp.Data;
  12. using Volo.Abp.DependencyInjection;
  13. using Volo.Abp.PermissionManagement;
  14. using Volo.Abp.Uow;
  15. namespace Himp.TaskScheduling.OpenIddict;
  16. /* Creates initial data that is needed to property run the application
  17. * and make client-to-server communication possible.
  18. */
  19. public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency
  20. {
  21. private readonly IConfiguration _configuration;
  22. private readonly IOpenIddictApplicationManager _applicationManager;
  23. private readonly IOpenIddictScopeManager _scopeManager;
  24. private readonly IPermissionDataSeeder _permissionDataSeeder;
  25. private readonly IStringLocalizer<OpenIddictResponse> L;
  26. public OpenIddictDataSeedContributor(
  27. IConfiguration configuration,
  28. IOpenIddictApplicationManager applicationManager,
  29. IOpenIddictScopeManager scopeManager,
  30. IPermissionDataSeeder permissionDataSeeder,
  31. IStringLocalizer<OpenIddictResponse> l)
  32. {
  33. _configuration = configuration;
  34. _applicationManager = applicationManager;
  35. _scopeManager = scopeManager;
  36. _permissionDataSeeder = permissionDataSeeder;
  37. L = l;
  38. }
  39. [UnitOfWork]
  40. public virtual async Task SeedAsync(DataSeedContext context)
  41. {
  42. await CreateScopesAsync();
  43. await CreateApplicationsAsync();
  44. }
  45. private async Task CreateScopesAsync()
  46. {
  47. if (await _scopeManager.FindByNameAsync("TaskScheduling") == null)
  48. {
  49. await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor
  50. {
  51. Name = "TaskScheduling",
  52. DisplayName = "TaskScheduling API",
  53. Resources =
  54. {
  55. "TaskScheduling"
  56. }
  57. });
  58. }
  59. }
  60. private async Task CreateApplicationsAsync()
  61. {
  62. var commonScopes = new List<string>
  63. {
  64. OpenIddictConstants.Permissions.Scopes.Address,
  65. OpenIddictConstants.Permissions.Scopes.Email,
  66. OpenIddictConstants.Permissions.Scopes.Phone,
  67. OpenIddictConstants.Permissions.Scopes.Profile,
  68. OpenIddictConstants.Permissions.Scopes.Roles,
  69. "TaskScheduling"
  70. };
  71. var configurationSection = _configuration.GetSection("OpenIddict:Applications");
  72. //Web Client
  73. var webClientId = configurationSection["TaskScheduling_Web:ClientId"];
  74. if (!webClientId.IsNullOrWhiteSpace())
  75. {
  76. var webClientRootUrl = configurationSection["TaskScheduling_Web:RootUrl"]!.EnsureEndsWith('/');
  77. /* TaskScheduling_Web client is only needed if you created a tiered
  78. * solution. Otherwise, you can delete this client. */
  79. await CreateApplicationAsync(
  80. name: webClientId!,
  81. type: OpenIddictConstants.ClientTypes.Confidential,
  82. consentType: OpenIddictConstants.ConsentTypes.Implicit,
  83. displayName: "Web Application",
  84. secret: configurationSection["TaskScheduling_Web:ClientSecret"] ?? "1q2w3e*",
  85. grantTypes: new List<string> //Hybrid flow
  86. {
  87. OpenIddictConstants.GrantTypes.AuthorizationCode,
  88. OpenIddictConstants.GrantTypes.Implicit
  89. },
  90. scopes: commonScopes,
  91. redirectUri: $"{webClientRootUrl}signin-oidc",
  92. postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc"
  93. );
  94. }
  95. //Console Test / Angular Client
  96. var consoleAndAngularClientId = configurationSection["TaskScheduling_App:ClientId"];
  97. if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
  98. {
  99. var consoleAndAngularClientRootUrl = configurationSection["TaskScheduling_App:RootUrl"]?.TrimEnd('/');
  100. await CreateApplicationAsync(
  101. name: consoleAndAngularClientId!,
  102. type: OpenIddictConstants.ClientTypes.Public,
  103. consentType: OpenIddictConstants.ConsentTypes.Implicit,
  104. displayName: "Console Test / Angular Application",
  105. secret: null,
  106. grantTypes: new List<string>
  107. {
  108. OpenIddictConstants.GrantTypes.AuthorizationCode,
  109. OpenIddictConstants.GrantTypes.Password,
  110. OpenIddictConstants.GrantTypes.ClientCredentials,
  111. OpenIddictConstants.GrantTypes.RefreshToken
  112. },
  113. scopes: commonScopes,
  114. redirectUri: consoleAndAngularClientRootUrl,
  115. postLogoutRedirectUri: consoleAndAngularClientRootUrl
  116. );
  117. }
  118. // Blazor Client
  119. var blazorClientId = configurationSection["TaskScheduling_Blazor:ClientId"];
  120. if (!blazorClientId.IsNullOrWhiteSpace())
  121. {
  122. var blazorRootUrl = configurationSection["TaskScheduling_Blazor:RootUrl"]?.TrimEnd('/');
  123. await CreateApplicationAsync(
  124. name: blazorClientId!,
  125. type: OpenIddictConstants.ClientTypes.Public,
  126. consentType: OpenIddictConstants.ConsentTypes.Implicit,
  127. displayName: "Blazor Application",
  128. secret: null,
  129. grantTypes: new List<string>
  130. {
  131. OpenIddictConstants.GrantTypes.AuthorizationCode,
  132. },
  133. scopes: commonScopes,
  134. redirectUri: $"{blazorRootUrl}/authentication/login-callback",
  135. postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback"
  136. );
  137. }
  138. // Swagger Client
  139. var swaggerClientId = configurationSection["TaskScheduling_Swagger:ClientId"];
  140. if (!swaggerClientId.IsNullOrWhiteSpace())
  141. {
  142. var swaggerRootUrl = configurationSection["TaskScheduling_Swagger:RootUrl"]?.TrimEnd('/');
  143. await CreateApplicationAsync(
  144. name: swaggerClientId!,
  145. type: OpenIddictConstants.ClientTypes.Public,
  146. consentType: OpenIddictConstants.ConsentTypes.Implicit,
  147. displayName: "Swagger Application",
  148. secret: null,
  149. grantTypes: new List<string>
  150. {
  151. OpenIddictConstants.GrantTypes.AuthorizationCode,
  152. },
  153. scopes: commonScopes,
  154. redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html"
  155. );
  156. }
  157. }
  158. private async Task CreateApplicationAsync(
  159. [NotNull] string name,
  160. [NotNull] string type,
  161. [NotNull] string consentType,
  162. string displayName,
  163. string? secret,
  164. List<string> grantTypes,
  165. List<string> scopes,
  166. string? redirectUri = null,
  167. string? postLogoutRedirectUri = null,
  168. List<string>? permissions = null)
  169. {
  170. if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase))
  171. {
  172. throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]);
  173. }
  174. if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, StringComparison.OrdinalIgnoreCase))
  175. {
  176. throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]);
  177. }
  178. if (!string.IsNullOrEmpty(name) && await _applicationManager.FindByClientIdAsync(name) != null)
  179. {
  180. return;
  181. //throw new BusinessException(L["TheClientIdentifierIsAlreadyTakenByAnotherApplication"]);
  182. }
  183. var client = await _applicationManager.FindByClientIdAsync(name);
  184. if (client == null)
  185. {
  186. var application = new OpenIddictApplicationDescriptor
  187. {
  188. ClientId = name,
  189. ClientType = type,
  190. ClientSecret = secret,
  191. ConsentType = consentType,
  192. DisplayName = displayName
  193. };
  194. Check.NotNullOrEmpty(grantTypes, nameof(grantTypes));
  195. Check.NotNullOrEmpty(scopes, nameof(scopes));
  196. if (new [] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All(grantTypes.Contains))
  197. {
  198. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken);
  199. if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase))
  200. {
  201. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken);
  202. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken);
  203. }
  204. }
  205. if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace())
  206. {
  207. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout);
  208. }
  209. var buildInGrantTypes = new []
  210. {
  211. OpenIddictConstants.GrantTypes.Implicit,
  212. OpenIddictConstants.GrantTypes.Password,
  213. OpenIddictConstants.GrantTypes.AuthorizationCode,
  214. OpenIddictConstants.GrantTypes.ClientCredentials,
  215. OpenIddictConstants.GrantTypes.DeviceCode,
  216. OpenIddictConstants.GrantTypes.RefreshToken
  217. };
  218. foreach (var grantType in grantTypes)
  219. {
  220. if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode)
  221. {
  222. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode);
  223. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code);
  224. }
  225. if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || grantType == OpenIddictConstants.GrantTypes.Implicit)
  226. {
  227. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization);
  228. }
  229. if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode ||
  230. grantType == OpenIddictConstants.GrantTypes.ClientCredentials ||
  231. grantType == OpenIddictConstants.GrantTypes.Password ||
  232. grantType == OpenIddictConstants.GrantTypes.RefreshToken ||
  233. grantType == OpenIddictConstants.GrantTypes.DeviceCode)
  234. {
  235. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token);
  236. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation);
  237. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection);
  238. }
  239. if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials)
  240. {
  241. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials);
  242. }
  243. if (grantType == OpenIddictConstants.GrantTypes.Implicit)
  244. {
  245. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit);
  246. }
  247. if (grantType == OpenIddictConstants.GrantTypes.Password)
  248. {
  249. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password);
  250. }
  251. if (grantType == OpenIddictConstants.GrantTypes.RefreshToken)
  252. {
  253. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken);
  254. }
  255. if (grantType == OpenIddictConstants.GrantTypes.DeviceCode)
  256. {
  257. application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode);
  258. application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device);
  259. }
  260. if (grantType == OpenIddictConstants.GrantTypes.Implicit)
  261. {
  262. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken);
  263. if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase))
  264. {
  265. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken);
  266. application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token);
  267. }
  268. }
  269. if (!buildInGrantTypes.Contains(grantType))
  270. {
  271. application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + grantType);
  272. }
  273. }
  274. var buildInScopes = new []
  275. {
  276. OpenIddictConstants.Permissions.Scopes.Address,
  277. OpenIddictConstants.Permissions.Scopes.Email,
  278. OpenIddictConstants.Permissions.Scopes.Phone,
  279. OpenIddictConstants.Permissions.Scopes.Profile,
  280. OpenIddictConstants.Permissions.Scopes.Roles
  281. };
  282. foreach (var scope in scopes)
  283. {
  284. if (buildInScopes.Contains(scope))
  285. {
  286. application.Permissions.Add(scope);
  287. }
  288. else
  289. {
  290. application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
  291. }
  292. }
  293. if (redirectUri != null)
  294. {
  295. if (!redirectUri.IsNullOrEmpty())
  296. {
  297. if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString())
  298. {
  299. throw new BusinessException(L["InvalidRedirectUri", redirectUri]);
  300. }
  301. if (application.RedirectUris.All(x => x != uri))
  302. {
  303. application.RedirectUris.Add(uri);
  304. }
  305. }
  306. }
  307. if (postLogoutRedirectUri != null)
  308. {
  309. if (!postLogoutRedirectUri.IsNullOrEmpty())
  310. {
  311. if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString())
  312. {
  313. throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]);
  314. }
  315. if (application.PostLogoutRedirectUris.All(x => x != uri))
  316. {
  317. application.PostLogoutRedirectUris.Add(uri);
  318. }
  319. }
  320. }
  321. if (permissions != null)
  322. {
  323. await _permissionDataSeeder.SeedAsync(
  324. ClientPermissionValueProvider.ProviderName,
  325. name,
  326. permissions,
  327. null
  328. );
  329. }
  330. await _applicationManager.CreateAsync(application);
  331. }
  332. }
  333. }