Моя цель — разрешить пользователям подключаться к нашему серверу 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'.
Любая идея, как я могу это исправить?





Итак, копаясь во всех ресурсах, которые я мог найти, я наткнулся на этот вопрос: «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 перенаправления», как это было упомянуто Китом Штейном.
