Новичок в. 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
Когда я назначаю разрешения для приложения разрешения
Примечание что приложение сообщает, что чтение и запись данных каталога «Не предоставлено для каталога по умолчанию», я использую каталог по умолчанию, это проблема?