Как получить сведения об аутентификации Azure при входе в систему через Microsoft Graph

Мне нужно получить все сведения о действиях входа пользователя через библиотеку 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Давайте посмотрим на свойства для 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, поэтому я не могу проверить ваш…

Спасибо за хорошее объяснение. Вопрос должен остаться здесь. К тому времени вы сможете обновить свой ответ, и он может стать хорошим руководством для ищущих. Кстати, есть ли какое-нибудь ручное решение, например, использование прямого API?

hasanbozkurt 04.07.2024 15:38

Конечно, мы можем использовать httpclient для отправки HTTP-запроса вместо использования Graph SDK, но для этого требуется токен токена доступа. Вот образец для получения токена. Затем мы можем использовать токен для прямого вызова API.

Tiny Wang 08.07.2024 03:59

@hasanbozkurt вы пытаетесь узнать методы аутентификации конкретного пользователя или пользователей арендатора по данным аутентификации?

Pratik Jadhav 08.07.2024 22:24

@PratikJadhav Я пытаюсь получить данные аутентификации для входа в систему. Я их собираю. Но они отсутствуют.

hasanbozkurt 09.07.2024 10:55

@hasanbozkurt Привет, у тебя есть еще вопросы по этому вопросу?

Tiny Wang 09.07.2024 11:48

@TinyWang Нет, спасибо!

hasanbozkurt 11.07.2024 00:07
Ответ принят как подходящий

Публикация подробностей подтверждения работы @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

Другие вопросы по теме