Функция AcquireTokenAsync не возвращает никакого ответа - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь получить список всех пользователей office365 из AzureAD в веб-приложении, используя указанный ниже код.Но authContext.AcquireTokenAsync (resrouce, clientCredential) никогда не возвращает обратно элемент управления.Я попробовал приведенный ниже код для консольного приложения, и он работал отлично.Но мне любопытно узнать, почему код не работает для веб-сайтов или какие изменения я должен внести, чтобы код работал в вебе.

public static async Task<string> AcquireMyToken()
        {
            string clientId = "";
            string secrect = "";
            string resrouce = "https://graph.microsoft.com";
            string authority = "https://login.microsoftonline.com/tenanId";
            AuthenticationContext authContext = new AuthenticationContext(authority);
            ClientCredential clientCredential = new ClientCredential(clientId, secrect);
            AuthenticationResult authResult = await authContext.AcquireTokenAsync(resrouce, clientCredential);
            return authResult.AccessToken;
        } 


public static async void ListFiles(string accessToken)
        {
            var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(
             (requestMessage) =>
             {
                 requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
                 return Task.FromResult(0);
             }));    
            var users = await graphClient.Users.Request().GetAsync();                  
        }      

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Для тестирования в консольном приложении вы можете заменить этот код ниже:

static async Task AccessMicrosoftUserData()
        {

            string clientId = "Your application Application Id";
            string secrect =  "Your application secret Id";
            string resrouce = "https://graph.microsoft.com";
            string authority = "https://login.microsoftonline.com/YourTenantId";
            // For example 
            // string authority = "https://login.microsoftonline.com/b6603c7be-a866-4666-ad87-e6921e61f999";
            AuthenticationContext authContext = new AuthenticationContext(authority);

            //Checking  application authenticity
            ClientCredential clientCredential = new ClientCredential(clientId, secrect);

            AuthenticationResult authResult = await authContext.AcquireTokenAsync(resrouce, clientCredential);
            //Generating Token with your credentails
            var accessToken = authResult.AccessToken;

            var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) => {
                requestMessage
                    .Headers
                    .Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                return Task.FromResult(0);
            }));
            //You may encounter request denial here if you don't have resource access 
              Privilege
            //To avoid this see the screen shot below.

            var users = await graphServiceClient.Users.Request().GetAsync();

        }

Теперь вызовите метод Main следующим образом:

 static void Main(string[] args)
        {


            AccessMicrosoftUserData().Wait();

        }

Пример для Web

var request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/token");
request.Content = new FormUrlEncodedContent(new Dictionary<string, string> {
    { "client_id", "your client_id" },
    { "client_secret", "your client_secret" },
    { "grant_type", "client_credentials" }
});

var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
var token = payload.Value<string>("access_token");

Примечание: В указанном выше коде http://server.com/token должна быть конечной точкой вашего токена, например https://login.microsoftonline.com/YourTenantID/oauth2/v2.0/token

Сложности реализации вы можете проверить здесь .Если вам нужно больше идей относительно разработки с нуля, вы также можете сослаться на this

Примечание: Вы можете столкнуться с отказом в запросе, если у вас нет доступа к ресурсам Привилегия Чтобы избежать этогосм. снимок экрана ниже:

enter image description here

0 голосов
/ 05 марта 2019

Что касается вопроса, вам необходимо указать свой код в контроллере и HTML.Ниже приведен пример.

public async Task<ActionResult> Test()
        {

            string clientId = "";
            string secrect = "";
            string resrouce = "https://graph.microsoft.com";
            string authority = "https://login.microsoftonline.com/tenanId";
            AuthenticationContext authContext = new AuthenticationContext(authority);
            ClientCredential clientCredential = new ClientCredential(clientId, secrect);
            AuthenticationResult authResult = await authContext.AcquireTokenAsync(resrouce, clientCredential);
            var token = authResult.AccessToken;
            var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) => {
                requestMessage
                    .Headers
                    .Authorization = new AuthenticationHeaderValue("bearer", token);

                return Task.FromResult(0);
            }));
           // var events = await graphServiceClient.Me.Events.Request().GetAsync();
            var users = await graphServiceClient.Users.Request().GetAsync();

            IList<User> userlist = users.CurrentPage;

            return View(userlist);
        }

HTML:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Sign-In with Microsoft Sample</title>
    <link href="@Url.Content("~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
</head>
<body style="padding:50px">
    <!--show the message your need-->
    <table class="table">
        <thead>
            <tr>
                <th scope="col">userPrincipalName</th>

                <th scope="col">Mail</th>

            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>@item.UserPrincipalName</td>
                    <td>@item.Mail</td>

                </tr>
            }
        </tbody>
    </table>
</body>
</html>

Для получения более подробной информации, пожалуйста, обратитесь к https://github.com/microsoftgraph/msgraph-training-aspnetmvcapp.

...