public MsAADTool(string commandName, ProvisioningToolOptions provisioningToolOptions) { ProvisioningToolOptions = provisioningToolOptions; _commandName = commandName; _tokenCredential = new MsalTokenCredential(provisioningToolOptions.TenantId, provisioningToolOptions.Username); _graphServiceClient = new GraphServiceClient(new TokenCredentialAuthenticationProvider(_tokenCredential)); }
private TokenCredential GetTokenCredential(ProvisioningToolOptions provisioningToolOptions, string?currentApplicationTenantId) { DeveloperCredentialsReader developerCredentialsReader = new DeveloperCredentialsReader(); return(developerCredentialsReader.GetDeveloperCredentials( provisioningToolOptions.Username, currentApplicationTenantId ?? provisioningToolOptions.TenantId)); }
private ProjectAuthenticationSettings InferApplicationParameters( ProvisioningToolOptions provisioningToolOptions, ProjectDescription projectDescription, IEnumerable <ProjectDescription> projectDescriptions) { CodeReader reader = new CodeReader(); ProjectAuthenticationSettings projectSettings = reader.ReadFromFiles(provisioningToolOptions.ProjectPath, projectDescription, projectDescriptions); // Override with the tools options projectSettings.ApplicationParameters.ApplicationDisplayName ??= Path.GetFileName(provisioningToolOptions.ProjectPath); projectSettings.ApplicationParameters.ClientId ??= provisioningToolOptions.ClientId; projectSettings.ApplicationParameters.TenantId ??= provisioningToolOptions.TenantId; projectSettings.ApplicationParameters.CalledApiScopes ??= provisioningToolOptions.CalledApiScopes; if (!string.IsNullOrEmpty(provisioningToolOptions.AppIdUri)) { projectSettings.ApplicationParameters.AppIdUri = provisioningToolOptions.AppIdUri; } return(projectSettings); }
public async Task <ApplicationParameters?> Run() { // If needed, infer project type from code ProjectDescription?projectDescription = ProjectDescriptionReader.GetProjectDescription( ProvisioningToolOptions.ProjectTypeIdentifier, ProvisioningToolOptions.ProjectPath); //need different error formatting when the output format is json. if (projectDescription == null) { Console.WriteLine($"The code in {ProvisioningToolOptions.ProjectPath} wasn't recognized as supported by the tool. Rerun with --help for details."); return(null); } else { if (ProvisioningToolOptions.Json == null || ProvisioningToolOptions.Json == false) { Console.WriteLine($"Detected project type {projectDescription.Identifier}. "); } } ProjectAuthenticationSettings projectSettings = InferApplicationParameters( ProvisioningToolOptions, projectDescription, ProjectDescriptionReader.projectDescriptions); // Case of a blazorwasm hosted application. We need to create two applications: // - the hosted web API // - the SPA. if (projectSettings.ApplicationParameters.IsBlazorWasm && projectSettings.ApplicationParameters.IsWebApi) { // Processes the hosted web API ProvisioningToolOptions provisioningToolOptionsBlazorServer = ProvisioningToolOptions.Clone(); provisioningToolOptionsBlazorServer.ProjectPath = Path.Combine(ProvisioningToolOptions.ProjectPath, "Server"); provisioningToolOptionsBlazorServer.ClientId = ProvisioningToolOptions.WebApiClientId; provisioningToolOptionsBlazorServer.WebApiClientId = null; AppProvisioningTool appProvisioningToolBlazorServer = new AppProvisioningTool(provisioningToolOptionsBlazorServer); ApplicationParameters?applicationParametersServer = await appProvisioningToolBlazorServer.Run(); /// Processes the Blazorwasm client ProvisioningToolOptions provisioningToolOptionsBlazorClient = ProvisioningToolOptions.Clone(); provisioningToolOptionsBlazorClient.ProjectPath = Path.Combine(ProvisioningToolOptions.ProjectPath, "Client"); provisioningToolOptionsBlazorClient.WebApiClientId = applicationParametersServer?.ClientId; provisioningToolOptionsBlazorClient.AppIdUri = applicationParametersServer?.AppIdUri; provisioningToolOptionsBlazorClient.CalledApiScopes = $"{applicationParametersServer?.AppIdUri}/access_as_user"; AppProvisioningTool appProvisioningToolBlazorClient = new AppProvisioningTool(provisioningToolOptionsBlazorClient); return(await appProvisioningToolBlazorClient.Run()); } // Case where the developer wants to have a B2C application, but the created application is an AAD one. The // tool needs to convert it if (!projectSettings.ApplicationParameters.IsB2C && !string.IsNullOrEmpty(ProvisioningToolOptions.SusiPolicyId)) { projectSettings = ConvertAadApplicationToB2CApplication(projectDescription, projectSettings); } // Case where there is no code for the authentication if (!projectSettings.ApplicationParameters.HasAuthentication) { Console.WriteLine($"Authentication is not enabled yet in this project. An app registration will " + $"be created, but the tool does not add the code yet (work in progress). "); } // Get developer credentials TokenCredential tokenCredential = GetTokenCredential( ProvisioningToolOptions, projectSettings.ApplicationParameters.EffectiveTenantId ?? projectSettings.ApplicationParameters.EffectiveDomain); // Unregister the app if (ProvisioningToolOptions.Unregister) { await UnregisterApplication(tokenCredential, projectSettings.ApplicationParameters); return(null); } // Read or provision Microsoft identity platform application ApplicationParameters?effectiveApplicationParameters = await ReadOrProvisionMicrosoftIdentityApplication( tokenCredential, projectSettings.ApplicationParameters); Summary summary = new Summary(); // Reconciliate code configuration and app registration if (effectiveApplicationParameters != null) { if (ProvisioningToolOptions.Json ?? false) { var jsonParameters = JsonSerializer.Serialize(effectiveApplicationParameters); Console.WriteLine(jsonParameters); } else { bool appNeedsUpdate = Reconciliate( projectSettings.ApplicationParameters, effectiveApplicationParameters); // Update appp registration if needed if (appNeedsUpdate) { await WriteApplicationRegistration( summary, effectiveApplicationParameters, tokenCredential); } // Write code configuration if needed WriteProjectConfiguration( summary, projectSettings, effectiveApplicationParameters); // Summarizes what happened WriteSummary(summary); } } return(effectiveApplicationParameters); }
public AppProvisioningTool(ProvisioningToolOptions provisioningToolOptions) { ProvisioningToolOptions = provisioningToolOptions; }
/// <summary> /// Identifier of a project type. This is the concatenation of the framework /// and the project type. This is the identifier of the extension describing /// the authentication pieces of the project /// </summary> public static string GetProjectTypeIdentifier(this ProvisioningToolOptions provisioningToolOptions) { return($"{provisioningToolOptions.LanguageOrFramework}-{provisioningToolOptions.ProjectType}"); }