Мне нужно получить все сведения о действиях входа пользователя через библиотеку Microsoft Graph. Я дал все разрешения(может дальше больше) Я могу получить всю информацию о входе в систему, но отсутствуют только данные аутентификации.
Пожалуйста, посмотрите на картинку, которую я указываю
Вот мой блок кода для получения всех журналов входа
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "aaaaaa-bbbb-cccc-dddd-fffffff";
var clientId = "kkkkkkkk-zzzz-yyyy-xxxxx-ghhhhhhh";
var clientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var tenantName = "example.com";
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://learn.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
var totalList = new List<Microsoft.Graph.Models.SignIn>();
GraphServiceClient graphClient = new GraphServiceClient(clientSecretCredential, scopes);
var signIns = await graphClient.AuditLogs.SignIns.GetAsync();
var aulogs= await graphClient.AuditLogs.GetAsync();
Как я могу также получить данные аутентификации? Класс SignIn не имеет такого свойства, как Property.
Давайте посмотрим на свойства для API Graph входа в список версии 1.0. На самом деле свойства Authentication Details нет, поэтому мы не получаем его в ответе, что должно быть ожидаемым поведением.
В качестве обходного пути мы можем использовать бета-версию API, содержащую свойство Authentication Details. Но API-интерфейсы бета-версии Microsoft Graph могут быть изменены. Использование этих API в рабочих приложениях не поддерживается. Нам лучше продолжать использовать версию V1.0, если это возможно.
Использование бета-версии Graph SDK требует от нас использования пакета Microsoft.Graph.Beta
вместо Microsoft.Graph
. Требуется выбрать опцию «Включить предварительную версию».
Но для этого API требуется лицензия Microsoft Entra ID P1 или P2, поэтому я не могу проверить ваш…
Конечно, мы можем использовать httpclient для отправки HTTP-запроса вместо использования Graph SDK, но для этого требуется токен токена доступа. Вот образец для получения токена. Затем мы можем использовать токен для прямого вызова API.
@hasanbozkurt вы пытаетесь узнать методы аутентификации конкретного пользователя или пользователей арендатора по данным аутентификации?
@PratikJadhav Я пытаюсь получить данные аутентификации для входа в систему. Я их собираю. Но они отсутствуют.
@hasanbozkurt Привет, у тебя есть еще вопросы по этому вопросу?
@TinyWang Нет, спасибо!
Публикация подробностей подтверждения работы @Tiny Wang,
В версии Microsoft Graph API v1.0 свойство authenticationDetails
недоступно в ответе, но оно доступно в бета-версии Microsoft Graph API. Однако API в бета-версии Microsoft Graph все еще разрабатываются и в большинстве случаев не рекомендуются. Для производства лучше всего использовать версию v1.0.
Для использования версии Microsoft Graph APIBeta
необходимо иметь лицензии Microsoft Entra ID P1 или P2.
Первоначально я зарегистрировал приложение Microsoft Entra, предоставил и согласился с разрешениями API типа приложения AuditLog.Read.All
и Directory.Read.All
:
Используйте приведенный ниже код C#, чтобы получить SignIndetail для всех пользователей со свойством аутентификацииDetails:
using Microsoft.Identity.Client;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
public class Program
{
private const string TenantId = "<tenant_id>";
private const string ClientId = "<app_id>";
private const string ClientSecret = "<client_secret>";
private const string Scope = "https://graph.microsoft.com/.default";
public static async Task Main(string[] args)
{
var accessToken = await GetAccessTokenAsync();
Console.WriteLine($"Access Token: {accessToken}");
var signInId = "YOUR_SIGNIN_ID";
await GetSignInLogAsync(signInId, accessToken);
}
private static async Task<string> GetAccessTokenAsync()
{
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(ClientId)
.WithClientSecret(ClientSecret)
.WithAuthority(new Uri($"https://login.microsoftonline.com/{TenantId}"))
.Build();
var result = await app.AcquireTokenForClient(new[] { Scope }).ExecuteAsync();
return result.AccessToken;
}
private static async Task GetSignInLogAsync(string signInId, string accessToken)
{
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await httpClient.GetAsync($"https://graph.microsoft.com/beta/auditLogs/signIns");
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Sign-In Log: {content}");
}
}
Выход:
Максимальный размер и размер по умолчанию — 1000 объектов, и по умолчанию сначала возвращаются самые последние входы.
Ссылка:
Вход в систему — бета-версия Microsoft Graph | Microsoft Learn
Спасибо за хорошее объяснение. Вопрос должен остаться здесь. К тому времени вы сможете обновить свой ответ, и он может стать хорошим руководством для ищущих. Кстати, есть ли какое-нибудь ручное решение, например, использование прямого API?