Подключение Azure Sql Server MFA из приложения .NET

Моя цель — разрешить пользователям подключаться к нашему серверу Azure Sql, используя свои учетные данные Azure Active Directory. Я пытаюсь выполнить шаги, описанные в этой статье, но получаю сообщение об ошибке, в котором не могу разобраться:
Подключитесь к базе данных SQL Azure с помощью Многофакторной идентификации Azure.

Ниже приведены соответствующие части моего кода, которые я в значительной степени скопировал из примера в статье (за исключением того, что мое приложение написано на VB.NET, поэтому мне пришлось переводить). Для этого требуется сборка Microsoft.IdentityModel.Clients.ActiveDirectory, которую я получил от NuGet.

Public Module DB
    Private ConnectionProvider As ActiveDirectoryAuthProvider

    'Gets run at application start    
    Public Sub SetProvider()
        ConnectionProvider = New ActiveDirectoryAuthProvider
        SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, ConnectionProvider)
    End Sub
End Module

'I can't believe Microsoft doesn't just have this as a class that's already been written
Public Class ActiveDirectoryAuthProvider
    Inherits SqlAuthenticationProvider

    Private ReadOnly _clientId As String = "Our Client ID From The Azure Portal"
    Private ReadOnly _redirectUri As New Uri("A Valid URL")

    Public Overrides Async Function AcquireTokenAsync(parameters As SqlAuthenticationParameters) As Task(Of SqlAuthenticationToken)
        Dim authContext As New AuthenticationContext(parameters.Authority)
        authContext.CorrelationId = parameters.ConnectionId
        Dim result As AuthenticationResult

        Select Case parameters.AuthenticationMethod
            Case SqlAuthenticationMethod.ActiveDirectoryInteractive
                result = Await authContext.AcquireTokenAsync(parameters.Resource, _clientId, _redirectUri, New PlatformParameters(PromptBehavior.Auto), New UserIdentifier(parameters.UserId, UserIdentifierType.RequiredDisplayableId))
            Case SqlAuthenticationMethod.ActiveDirectoryIntegrated
                result = Await authContext.AcquireTokenAsync(parameters.Resource, _clientId, New UserCredential())
            Case SqlAuthenticationMethod.ActiveDirectoryPassword
                result = Await authContext.AcquireTokenAsync(parameters.Resource, _clientId, New UserPasswordCredential(parameters.UserId, parameters.Password))
            Case Else
                Throw New InvalidOperationException()
        End Select

        Return New SqlAuthenticationToken(result.AccessToken, result.ExpiresOn)
    End Function

    Public Overrides Function IsSupported(ByVal authenticationMethod As SqlAuthenticationMethod) As Boolean
        Return authenticationMethod = SqlAuthenticationMethod.ActiveDirectoryIntegrated OrElse authenticationMethod = SqlAuthenticationMethod.ActiveDirectoryInteractive OrElse authenticationMethod = SqlAuthenticationMethod.ActiveDirectoryPassword
    End Function
End Class

'And finally, I create new connections like this:
New SqlConnection($"Server=tcp:ourserver.database.windows.net,1433;Initial Catalog=OurDatabase;TrustServerCertificate=True;Pooling=False;Encrypt=True;Authentication = ""Active Directory Interactive"";User ID = {Environment.UserName}@OurDomain.com;")

Используя этот код, я получаю всплывающее окно от Azure с просьбой войти в систему при запуске SqlConnection.Open. Однако, как только я вошел в систему, я получаю следующее исключение:

Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException
AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.

Любая идея, как я могу это исправить?

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

Ответы 2

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

Итак, копаясь во всех ресурсах, которые я мог найти, я наткнулся на этот вопрос: «error_description»: «AADSTS70002: Тело запроса должно содержать следующий параметр: «client_secret или client_assertion».

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

В статье Microsoft в моем вопросе говорится: «Для этой статьи любое допустимое значение подходит для RedirectUri, потому что оно здесь не используется». Пример, который они используют: «https://mywebserver.com/».

Вопреки цитате Microsoft, ответ, который я дал выше, указывает, что Azure использует URI перенаправления для определения типа регистрируемого приложения. Изменение URI с веб-сайта моей компании на «https://login.microsoftonline.com/common/oauth2/nativeclient» устраняет мою проблему. Этот URL-адрес является одним из значений по умолчанию, которые Azure позволяет вам выбирать. Это явно указывает Azure, что вы регистрируете собственное приложение, а не веб-приложение. Как только Azure узнает об этом, кажется, что он перестает требовать «client_assertion» или «client_secret», которые, я могу только предположить, необходимы для аутентификации веб-приложения.

Я столкнулся с этой проблемой немного раньше, потратил много времени, чтобы выяснить проблему, и единственным решением, которое помогло, было добавление «https://login.microsoftonline.com/common/oauth2/nativeclient» на вкладке «Аутентификация» к «URI перенаправления», как это было упомянуто Китом Штейном.

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