예제 #1
0
        // Default to AAD (developer workstation scenario)
        public async Task ConnectAsync()
        {
            string tenant = "microsoft.com";

            string aadAuthority = $"https://login.windows.net/{tenant}";

            // Fixed static resource Guid for Azure Devops
            string aadResource = "499b84ac-1321-427f-aa17-267ca6975798";

            // MSA client ID if you don't have an application ID regsitered with Azure
            string aadClientId = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1";

            // Login now
            AuthenticationContext authCtx = new AuthenticationContext(aadAuthority);
            string         aadUser        = $"{Environment.UserName}@{tenant}";
            UserCredential userCredential = new UserCredential(aadUser);

            Console.WriteLine($"Logging in as {userCredential.UserName}");
            this.AuthenticationResult = await authCtx.AcquireTokenAsync(aadResource, aadClientId, userCredential);

            // Connect to Azure DevOps
            Uri collectionUri = new Uri($"https://dev.azure.com/{this.OrganizationName}");
            VssOAuthAccessTokenCredential oAuthCredentials = new VssOAuthAccessTokenCredential(this.AuthenticationResult.AccessToken);
            VssCredentials vssCredentials = oAuthCredentials;

            this.VssConnection = new VssConnection(collectionUri, vssCredentials);
        }
예제 #2
0
        /// <summary>
        /// Connects to a client.
        /// </summary>
        /// <typeparam name="T">The client type.</typeparam>
        /// <param name="token">The OAuth token.</param>
        /// <param name="account">The name of the account to connect to.</param>
        /// <returns>A client.</returns>
        private async Task <T> ConnectAsync <T>(OAuthToken token, string account = null)
            where T : VssHttpClientBase
        {
            var credentials = new VssOAuthAccessTokenCredential(new VssOAuthAccessToken(token.AccessToken));

            var uri = !string.IsNullOrWhiteSpace(account) ? new Uri(string.Format(CultureInfo.InvariantCulture, VstsUrl, account)) : this.vstsAppUrl;

            return(await new VssConnection(uri, credentials).GetClientAsync <T>());
        }
예제 #3
0
        public IEnumerable <TeamProjectReference> InteractiveADAL(string vstsAccountName, string applicationId)
        {
            AuthenticationContext authenticationContext = new AadAuthenticationContext("https://login.windows.net/common", validateAuthority: true);
            var authenticationResultTask = authenticationContext.AcquireTokenAsync(VSTSResourceId, applicationId, new Uri(RedirectUri), new PlatformParameters(PromptBehavior.Auto));
            AuthenticationResult authenticationResult = authenticationResultTask.Result;

            VssOAuthAccessTokenCredential oAuthCredential = new VssOAuthAccessTokenCredential(authenticationResult.AccessToken);

            return(ListProjectsViaClientLibrary(vstsAccountName, oAuthCredential));
        }
        public override VssCredentials GetVssCredentials(IHostContext context)
        {
            Tracing trace = context.GetTrace("OuthAccessToken");

            trace.Info("GetVssCredentials()");

            var            loginCred = new VssOAuthAccessTokenCredential("sometoken");
            VssCredentials creds     = new VssCredentials(loginCred);

            trace.Verbose("cred created");

            return(creds);
        }
예제 #5
0
        public IEnumerable <TeamProjectReference> DeviceCodeADAL(string vstsAccountName, string applicationId)
        {
            Guid tenant = GetAccountTenant(vstsAccountName);
            AuthenticationContext authenticationContext = new AadAuthenticationContext("https://login.windows.net/" + tenant, validateAuthority: true);
            DeviceCodeResult      codeResult            = authenticationContext.AcquireDeviceCodeAsync(VSTSResourceId, applicationId).Result;

            Console.WriteLine("You need to sign in.");
            Console.WriteLine("Message: " + codeResult.Message + "\n");
            AuthenticationResult authenticationResult = authenticationContext.AcquireTokenByDeviceCodeAsync(codeResult).Result;

            VssOAuthAccessTokenCredential oAuthCredential = new VssOAuthAccessTokenCredential(authenticationResult.AccessToken);

            return(ListProjectsViaClientLibrary(vstsAccountName, oAuthCredential));
        }
예제 #6
0
        /// <summary>
        /// Init Devops clients with an access token (bearer)
        /// </summary>
        private void ConnectWithBearerToken(string bearerToken)
        {
            Uri collectionUri = new Uri($"https://dev.azure.com/{this.OrganizationName}");

            this.logger.LogInformation($"Connect to {collectionUri} using bearer token");

            VssOAuthAccessTokenCredential oAuthCredentials = new VssOAuthAccessTokenCredential(bearerToken);
            VssCredentials vssCredentials = oAuthCredentials;

            this.VssConnection = new VssConnection(collectionUri, vssCredentials);

            // Configure timeout and retry on DevOps HTTP clients
            this.VssConnection.Settings.SendTimeout = TimeSpan.FromMinutes(5);
        }
        public async Task <VssConnection> GetConnectionAsync()
        {
            var token = await GetTokenAsync()
                        .ConfigureAwait(false);

            if (token is null)
            {
                return(null);
            }

            var connectionUri  = new Uri(token.Organization);
            var connectionCred = new VssOAuthAccessTokenCredential(token.AccessToken);

            return(new VssConnection(connectionUri, connectionCred));
        }
예제 #8
0
        protected async Task <T> ConnectAsync <T>(OAuthToken token, string account = null, bool isRm = false)
            where T : VssHttpClientBase
        {
            var credentials = new VssOAuthAccessTokenCredential(new VssOAuthAccessToken(token.AccessToken));

            var uri = this.vstsAppUrl;

            if (!string.IsNullOrWhiteSpace(account))
            {
                uri = isRm
                    ? new Uri(string.Format(CultureInfo.InvariantCulture, VstsRmUrl, HttpUtility.UrlEncode(account)))
                    : new Uri(string.Format(CultureInfo.InvariantCulture, VstsUrl, HttpUtility.UrlEncode(account)));
            }

            return(await new VssConnection(uri, credentials).GetClientAsync <T>());
        }
예제 #9
0
        public async Task <T> GetUserClient <T>() where T : VssHttpClientBase
        {
            ClaimsPrincipal user = httpContextAccessor.HttpContext.User;

            if (user.Identity.IsAuthenticated)
            {
                Claim      id         = user.Claims.Single(v => v.Type == ClaimTypes.NameIdentifier);
                ActiveUser activeUser = await activeUsers.Get(id.Value);

                var credentials = new VssOAuthAccessTokenCredential(activeUser.AccessToken);
                var connection  = new VssConnection(new Uri(config.OrganizationBaseUrl), credentials);
                return(connection.GetClient <T>());
            }
            else
            {
                throw new Exception("User is no authenticated");
            }
        }
예제 #10
0
        public async Task <Revision> QueueBuild(AzureDevOpsSettings azureDevOps,
                                                QueueBuildRequest queueBuildRequest, string accessToken)
        {
            var credentials = new VssOAuthAccessTokenCredential(accessToken);
            var connection  = new VssConnection(
                new Uri($"https://dev.azure.com/{azureDevOps.Organization}"),
                credentials);

            try
            {
                var buildClient = connection.GetClient <BuildHttpClient>();
                var definition  = await buildClient.GetDefinitionAsync(azureDevOps.Project, int.Parse(azureDevOps.BuildDefinition));

                Dictionary <string, string> parameters = queueBuildRequest.Variables.ToDictionary(v => v.Key, v => v.Value);
                Build build = new Build
                {
                    Definition   = definition,
                    Project      = definition.Project,
                    SourceBranch = queueBuildRequest.Branch,
                    Parameters   = JsonConvert.SerializeObject(parameters)
                };
                var response = await buildClient.QueueBuildAsync(build);

                var revision = new Revision()
                {
                    RevisionNumber = response.Id.ToString(),
                    Requestor      = response.RequestedBy.DisplayName,
                    CreatedTime    = DateTimeOffset.Now
                };

                return(revision);
            }
            catch (Exception)
            {
                return(null);
            }
        }