Ejemplo n.º 1
0
        public async Task <HttpResponseData> RunHttpTrigger([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req, FunctionContext executionContext)
        {
            var logger = executionContext.GetLogger("HttpTrigger");

            var principal = await _authentication.AuthenticateAsync(executionContext, req);

            if (principal == null)
            {
                return(_authentication.ReplyUnauthorized(req));
            }

            var microsoftGraph = new GraphServiceClient(new DelegateAuthenticationProvider(async(request) =>
            {
                var token = await _authentication.GetAccessTokenForUserAsync(req, new string[] { "https://graph.microsoft.com/.default" });
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
            }));

            var name = principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name").First().Value;

            logger.LogInformation($"User is {name}!");

            var inbox = await microsoftGraph.Me.MailFolders.Inbox.Request().GetAsync();

            logger.LogInformation($"{name} has {inbox.UnreadItemCount} unread e-mails!");

            var response = req.CreateResponse(HttpStatusCode.OK);

            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");

            response.WriteString($"Welcome to Azure Functions Out-Of-Process, {name}!\n\nYou have {inbox.UnreadItemCount} unread e-mails!");

            return(response);
        }
        private async Task <HttpResponseMessage> InternalMakeRequestAsync(
            TimeSpan timeout,
            HttpCompletionOption completionOption,
            HttpMethod method,
            string path,
            IQueryString queryString,
            IDictionary <string, string> headers,
            Func <HttpContent> content,
            CancellationToken cancellationToken)
        {
            await EnsureConnection();

            var request = PrepareRequest(method, path, queryString, headers, content);

            if (timeout != InfiniteTimeout)
            {
                var timeoutTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                timeoutTokenSource.CancelAfter(timeout);
                cancellationToken = timeoutTokenSource.Token;
            }

            await _authenticationProvider.AuthenticateAsync(request);

            var response = await _client.SendAsync(request, completionOption, cancellationToken);

            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                //Prepare another request (we can't reuse the same request)
                var request2 = PrepareRequest(method, path, queryString, headers, content);

                //Authenticate given the challenge
                await _authenticationProvider.AuthenticateAsync(request2, response);

                //Send it again
                response = await _client.SendAsync(request2, completionOption, cancellationToken);
            }

            return(response);
        }