Можно ли использовать делегированный доступ с конфиденциальным клиентом в библиотеке аутентификации Microsoft?

Когда я использую поток секретной аутентификации клиента с конфиденциальным клиентом, как я могу аутентифицировать пользователя (того, который подключается как HTTP-клиент к моему веб-сайту или любой другой метод доступа к сети) и использовать делегированный доступ?

Я понимаю, как это сделать с публичным клиентом. Я также мог бы использовать общедоступный клиентский поток на этом сервере, но это не имело бы особого смысла, поскольку технически мой сервер должен быть конфиденциальным клиентом.

Минимальный рабочий пример (если "MY.\{-}" заменен действительным набором секретного кода клиента, идентификатора клиента и идентификатора клиента):

package main

import (
        "context"
        "fmt"

        "github.com/AzureAD/microsoft-authentication-library-for-go/apps/confidential"
)

func main() {
        cred, err := confidential.NewCredFromSecret("MY_CLIENT_SECRET")
        if err != nil {
                panic(err)
        }

        confidential_client, err := confidential.New(
                "https://login.microsoftonline.com/"+"MY_TENANT_ID",
                "MY_CLIENT_ID",
                cred,
        )
        if err != nil {
                panic(err)
        }

        result, err := confidential_client.AcquireTokenByCredential(
                context.Background(),
                []string{"User.Read"},
        )
        if err != nil {
                panic(err)
        }

        fmt.Println(result)
}

Результаты:

{
        "error": "invalid_scope",
        "error_description": "AADSTS1002012: The provided value for scope User.
Read openid offline_access profile is not valid. Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI). Trace ID: REDACTED Correlation ID: REDACTED Timestamp: 2024-08-16 03:46:42Z",
        "error_codes": [1002012],
        "timestamp": "2024-08-16 03:46:42Z",
        "trace_id": "REDACTED",
        "correlation_id":"REDACTED" 
}

Объем должен быть https://graph.microsoft.com/.default для AcquireTokenByCredential потока. Дайте мне знать, если это сработает

Rukmini 16.08.2024 05:55

Для конфиденциального клиента вы не можете использовать делегированный доступ.

Rukmini 16.08.2024 05:57

@Rukmini Я в замешательстве, потому что Learn.microsoft.com/en-us/entra/identity-platform/…, кажется, предполагает, что конфиденциальные клиенты могут: (1) приобретать токены для самого приложения, (2) использовать Поток OBO (что для меня не имеет смысла, поскольку у меня нет JS или какого-либо подобного интерфейса, и я не собираюсь вызывать API, мне просто нужно аутентифицировать пользователей) и (3) получить токены с использованием потока кода авторизации.

Runxi Yu 16.08.2024 06:42

@Rukmini Я думал, что простая аутентификация пользователей с помощью MSAL из веб-приложения требует делегированного доступа.

Runxi Yu 16.08.2024 06:44

Какую область вы хотите передать? и какой API вы хотите вызвать?

Rukmini 16.08.2024 06:45

@Rukmini Единственная область, которая мне нужна, - это User.Read, а именно для чтения отображаемого имени пользователя, адреса электронной почты и какого-то уникального идентификатора пользователя (подойдет UUID, который не меняется).

Runxi Yu 16.08.2024 06:45

Да, это сработает, но должны быть возможности для конфиденциального клиента https://graph.microsoft.com/.default

Rukmini 16.08.2024 06:45

Конфиденциальный клиент работает только с разрешениями API типа приложения, поэтому вам необходимо предоставить разрешение API типа приложения User.Read.All, поскольку User.Read делегируется.

Rukmini 16.08.2024 06:46

Чтобы быть более ясным, если задействовано взаимодействие с пользователем и если вы хотите получить сведения о вошедшем в систему пользователе, вы не можете использовать конфиденциальный клиентский поток. Вам необходимо использовать поток кода авторизации с разрешением User.Read.

Rukmini 16.08.2024 06:53

Понятно, полагаю, я просто буду использовать публичный клиентский поток (поскольку получить User.Read.All у меня невозможно из-за политик организации). Это заставляет меня задуматься, как работает github.com/rayluo/identity...

Runxi Yu 16.08.2024 06:54

Извините, всегда ли поток кода авторизации включает общедоступный клиент? И наоборот, можно ли ограничить использование потока кода авторизации моей регистрации клиентом, аутентифицированным с помощью секретного кода клиента?

Runxi Yu 16.08.2024 06:55

Никаких проблем с общедоступным потоком клиентов не возникнет.

Rukmini 16.08.2024 06:55

Могу ли я опубликовать ответ?

Rukmini 16.08.2024 06:55

Пожалуйста... спасибо!

Runxi Yu 16.08.2024 06:56

@NaveenSharma Я сделаю это, если это действительно то решение, которое я получу, поскольку я экспериментирую с использованием OpenID Connect. Хотя теперь я понимаю концепцию принятия ответов. Спасибо!

Runxi Yu 16.08.2024 08:02
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
15
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратите внимание: Конфиденциальный клиент работает только с разрешениями API типа приложения и не требует взаимодействия с пользователем.

Например, я попытался сгенерировать токен через почтальона и получил ту же ошибку, что и вы:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id:ClientID
client_secret:ClientSecret
scope↵:https://graph.microsoft.com/.default
grant_type:client_credentials

Ошибка «Указанное значение для области User.Read недопустимо. Потоки учетных данных клиента должны иметь значение области с суффиксом /.default к идентификатору ресурса (URI идентификатора приложения)» обычно возникает, если область при использовании конфиденциального клиента не имеет суффикса. по умолчанию. Чтобы устранить ошибку, используйте https://graph.microsoft.com/.default

Конфиденциальный клиент не подходит для вашего сценария, поскольку вы хотите передать область как User.Read и не хотите передавать секрет клиента, вы можете использовать общедоступный поток клиентов.

  • Если требуется взаимодействие с пользователем и вы хотите получить сведения о вошедшем в систему пользователе, вам необходимо использовать любой интерактивный поток пользователя.

  • Это предполагает предоставление делегированных разрешений API.

  • А затем вызовите конечную точку https://graph.microsoft.com/v1.0/me, чтобы получить данные вошедшего пользователя.

Изначально я не был уверен, что использование общедоступного клиентского потока уместно, поскольку я хочу, чтобы серверная часть моего веб-приложения могла использовать эту веб-регистрацию. Теперь, когда я об этом думаю, установка правильного URI перенаправления должна смягчить эту проблему.

Runxi Yu 16.08.2024 07:56

Да, вам нужно установить URI перенаправления

Rukmini 16.08.2024 07:57

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