Esempio n. 1
0
 public MsAADTool(string commandName, ProvisioningToolOptions provisioningToolOptions)
 {
     ProvisioningToolOptions = provisioningToolOptions;
     _commandName            = commandName;
     _tokenCredential        = new MsalTokenCredential(provisioningToolOptions.TenantId, provisioningToolOptions.Username);
     _graphServiceClient     = new GraphServiceClient(new TokenCredentialAuthenticationProvider(_tokenCredential));
 }
Esempio n. 2
0
        private TokenCredential GetTokenCredential(ProvisioningToolOptions provisioningToolOptions, string?currentApplicationTenantId)
        {
            DeveloperCredentialsReader developerCredentialsReader = new DeveloperCredentialsReader();

            return(developerCredentialsReader.GetDeveloperCredentials(
                       provisioningToolOptions.Username,
                       currentApplicationTenantId ?? provisioningToolOptions.TenantId));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 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}");
 }