Ошибка добавления пользователя AzureAD в мое приложение NetCore? - PullRequest
1 голос
/ 19 июня 2020

Новичок в. net Core WebApp, я пытаюсь использовать приведенный ниже код, но при попытке проверить пользователя получаю сообщение об ошибке. Я проверяю дважды, в первый раз с существующей учетной записью

Вот код ...

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace JBSTestAdLoginVSApp.Controllers
{
    public class NewAccountController : Controller
    {
        public IActionResult Index()
        //public String Index()
        {
            return View();
            //return "This is my default action...";
        }
        [HttpPost]
        public async void Index(string userPrincipal, string displayName, string mailNickName, string password)
        {
            ViewBag.Name = string.Format("Name: {0} {1} {2} {3}", userPrincipal, displayName, mailNickName, password);
            await Test();
            return;// View();
        }
        private static async Task<string> AppAuthenticationAsync()
        {
            //  Constants
            var tenant = "**************.onmicrosoft.com";  //grabbed from Azure AD
            var resource = "https://graph.microsoft.com/";
            var clientID = "62***********";  //created app and grand read write perms
            var secret = "******";  //added secret to app id

            //  Ceremony
            var authority = $"https://login.microsoftonline.com/{tenant}";
            var authContext = new AuthenticationContext(authority);
            var credentials = new ClientCredential(clientID, secret);
            var authResult = await authContext.AcquireTokenAsync(resource, credentials);

            return authResult.AccessToken;
        }
        private static async Task<bool> DoesUserExistsAsync(HttpClient client, string user)
        {
            try
            {
                var payload = await client.GetStringAsync($"https://graph.microsoft.com/v1.0/users/{user}");//fails here with Exception thrown: 'System.Net.Http.HttpRequestException' in System.Private.CoreLib.dll

                return true;
            }
            catch (HttpRequestException)
            {
                return false;
            }
        }
        private static async Task<string[]> GetUserGroupsAsync(HttpClient client, string user)
        {
            var payload = await client.GetStringAsync(
                $"https://graph.microsoft.com/v1.0/users/{user}/memberOf");
            var obj = JsonConvert.DeserializeObject<JObject>(payload);
            var groupDescription = from g in obj["value"]
                                   select g["displayName"].Value<string>();

            return groupDescription.ToArray();
        }
        private static async Task CreateUserAsync(HttpClient client, string user, string domain)
        {
            using (var stream = new MemoryStream())
            using (var writer = new StreamWriter(stream))
            {
                var payload = new
                {
                    accountEnabled = true,
                    displayName = user,
                    mailNickname = user,
                    userPrincipalName = $"{user}@{domain}",
                    passwordProfile = new
                    {
                        forceChangePasswordNextSignIn = true,
                        password = "tempPa$$w0rd"
                    }
                };
                var payloadText = JsonConvert.SerializeObject(payload);

                writer.Write(payloadText);
                writer.Flush();
                stream.Flush();
                stream.Position = 0;

                using (var content = new StreamContent(stream))
                {
                    content.Headers.Add("Content-Type", "application/json");

                    var response = await client.PostAsync("https://graph.microsoft.com/v1.0/users/", content);

                    if (!response.IsSuccessStatusCode)
                    {
                        throw new InvalidOperationException(response.ReasonPhrase);
                    }
                }
            }
        }
        private static async Task Test()
        {
            //var token = await AppAuthenticationAsync();

            var token = await AppAuthenticationAsync();

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                var userA = "Test@*****.onmicrosoft.com";//this account exists
                var userExistA = await DoesUserExistsAsync(client, userA);

                var user = "NewUser1@********.onmicrosoft.com";//this account doesnt
                var userExist = await DoesUserExistsAsync(client, user);

                Console.WriteLine($"Does user exists?  {userExist}");

                if (userExist)
                {
                    var groups = await GetUserGroupsAsync(client, user);

                    foreach (var g in groups)
                    {
                        Console.WriteLine($"Group:  {g}");
                    }


                } else
                {
                    await CreateUserAsync(client, "newuser", "******.onmicrosoft.com");
                }
            }
        }
    }
}

Не уверен, правильно ли я создал приложение reg, потому что, когда DoesUserExistsAsyn c запускает его выдает исключение: 'System. Net .Http.HttpRequestException' в System.Private.CoreLib.dll

Когда я назначаю разрешения для приложения разрешения

Примечание что приложение сообщает, что чтение и запись данных каталога «Не предоставлено для каталога по умолчанию», я использую каталог по умолчанию, это проблема?

1 Ответ

1 голос
/ 20 июня 2020

после того, как вы дадите разрешение приложению, вы должны нажать кнопку «Предоставить согласие администратора» для каталога по умолчанию. в противном случае это не сработает, если вы не дадите согласие, разрешение api графика не будет иметь разрешения на чтение никому из пользователей.

enter image description here

Если пользователь не существует, это правильное поведение, так как httprequestexception вызывается, если вы не добились успеха, например 404 .. if вы пытаетесь попасть в конечную точку графика с пользователем, которого не существует, он вернет 404, что вызовет httpexception, как вы видели. Также, если у вас нет разрешений на чтение всех пользователей (потому что вы не дали согласия), тогда он будет действовать так, как если бы он ничего не нашел, что снова вернет 404.

после того, как вы дадите согласие на организацию и поиск существующего пользователя, он должен вернуть true.

...