当前位置: 首页 > 知识库问答 >
问题:

使用AAD标识从应用程序服务连接到Azure SQL

云承弼
2023-03-14

已将本地Web应用程序(. net 4.6.1)迁移到Azure,该应用程序对其用户使用Windows身份验证,然后使用AD集成身份验证连接到MSSQL数据库。

理想情况下,应该保留现有的安全机制,即向AD用户授予对数据库对象的权限,并让DB成为应用程序的安全源。

已创建并配置SQL数据库的副本。

如果我在本地运行web应用程序,但使用新的Azure数据库,则一切正常。

如果我运行此命令,我将获得预期的AD用户:

SELECT CURRENT_USER;

现在,当我将完全相同的应用程序部署到Azure应用程序服务并启用Azure Active Directory身份验证和托管服务标识时,用户在Web应用程序上已正确身份验证,但无法连接到SQL数据库,并返回以下错误:

错误=系统。数据SqlClient。SqlErrorCollection客户端连接ID=e9f0c48a-3159-465c-ab72-c1da99761b8f类=14行号=65536号=18456过程=服务器=XXXXXXXXXX。tr4.canadacentral1-a.worker。数据库窗户。net,11057状态=1源=。Net SqlClient数据提供程序错误代码=-2146232060消息=用户“NT授权\匿名登录”登录失败

如果禁用托管服务标识,则会出现以下错误:

InnerExceptions=系统。收藏。ObjectModel。ReadOnlyCollection“1[系统.异常]消息=发生了一个或多个错误。数据=系统。收藏。ListDictionaryInternalInnerException=Microsoft。蔚蓝色的服务。AppAuthentication。AzureServiceTokenProviderException:参数:连接字符串:[未指定连接字符串],资源:https://database.windows.net/,权限:。异常消息:尝试了以下4种方法来获取访问令牌,但均无效。参数:连接字符串:[未指定连接字符串],资源:https://database.windows.net/,权限:。异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识(MSI)终结点。请检查您是否在具有MSI设置的Azure资源上运行。参数:连接字符串:[未指定连接字符串],资源:https://database.windows.net/,权限:。异常消息:尝试使用Visual Studio获取令牌。无法获取访问令牌。在“D:\local\LocalAppData.IdentityService\AzureServiceAuth\tokenprovider.json”中找不到Visual Studio令牌提供程序文件参数:连接字符串:[未指定连接字符串],资源:https://database.windows.net/,权限:。异常消息:尝试使用Azure CLI获取令牌。无法获取访问令牌。“az’不被识别为内部或外部命令、可操作程序或批处理文件。参数:连接字符串:[未指定连接字符串],资源:https://database.windows.net/,授权:https://login.microsoftonline.com/common.异常消息:尝试使用Active Directory集成身份验证获取令牌。无法获取访问令牌。get\u user\u name\u失败:无法获取用户名内部异常:指定域名的格式为Invalidate Microsoft。蔚蓝色的服务。AppAuthentication。AzureServiceTokenProvider。d\u 14。MoveNext()

这是我想做的吗?如果是,我遗漏了什么?任何想法都将不胜感激。

作为参考,以下是返回SQL连接的方法:

private SqlConnection GetSqlConnection()
{
    var accessToken = new AzureServiceTokenProvider().GetAccessTokenAsync("https://database.windows.net/").Result;

    return new SqlConnection
    {
        ConnectionString = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString,
        AccessToken = accessToken
    };
}

... 这是连接字符串:

  <connectionStrings>
    <add name="Default" connectionString="Data Source=myserver.database.windows.net;Initial Catalog=MyDB;" providerName="System.Data.SqlClient" />
  </connectionStrings>

注意:本地广告已与其Azure广告对应项同步。

共有3个答案

别浩漫
2023-03-14

部署应用程序后,请将应用程序设置和连接字符串放入Azure上的webapp应用程序设置选项。请参阅本文。

注意:它已从Azure应用程序服务的–应用程序设置刀片服务器中配置的应用程序设置中提取值,但未从Web提取值。配置文件。这样,您可以随时更改这些可配置的值,而无需依赖于开发人员。同样的规则甚至适用于连接字符串。

戚研
2023-03-14

确保您已在Azure SQL中添加身份用户并授予所需的权限。

CREATE USER [MyAppIdentity] FROM EXTERNAL PROVIDER
GO
ALTER ROLE db_datareader ADD MEMBER [MyAppIdentity];
ALTER ROLE db_datawriter ADD MEMBER [MyAppIdentity];
濮君植
2023-03-14

我认为要解决您的问题,您必须执行以下操作:

  • 授予用户作为数据库中的外部供应商的访问权限:(当您选择所有应用程序时,您也可以在AAD中的企业应用程序下找到)。重要的是要确保此时已经创建了该应用服务标识。
    • 对于Web应用程序,它是Web应用程序的名称
    • 如果您使用的是部署插槽,则sql用户名为{应用程序名称}/插槽/{插槽名称}
    • 如果您使用用户托管身份,您还必须使用以下值指定应用设置AzureServicesAuthConnectionStringRunAs=App; AppId={ClientId of标识}
    • 连接字符串可以是这样的:Server=tcp:{server}。database.windows.net,1433;初始目录={Database aseName};持久安全信息=False;MultipleActiveResultSets=True;加密=True;信任服务器证书=False;身份验证=“活动目录交互”
      • 这也适用于EntityFramework,但如果您直接在Azure中设置连接字符串,则需要选择Custom而不是SqlAzure作为提供程序。
      <SqlAuthenticationProviders>
         <providers>
            <add name="Active Directory Interactive" type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
         </providers>
      </SqlAuthenticationProviders>
      

 类似资料:
  • 问题内容: 我无法让我的Android应用程序连接到socket.io聊天服务器。我正在使用由Gottox创建的socket.io-java- client,可以在这里找到:https : //github.com/Gottox/socket.io-java- client 服务器在端口7000上本地运行。我使用的是Android模拟器,因此我使用的是10.0.2.2:7000来访问服务器。 任何

  • 我的grails 2.1.0应用程序是在cloudfoundry中部署和运行的,使用mysql服务,昨天我做了一些更改,更新后无法再次运行。我没有对数据源进行任何更改。 通过查看tomcat日志,看起来数据库设置在部署时没有被覆盖,如文档中所述,并且存在一个异常消息“无法为连接URL“JDBC:h2:prodDb;MVCC=TRUE”创建类为“com.mysql.JDBC.driver”的JDBC

  • 我有一个问题,我用套接字构建了服务器部分和客户机,没有收到任何错误。当我在浏览器中键入本地地址时,它会在cmd中显示信息,但当我在emulator或mobile中运行Android应用程序时,它不会连接到服务器。 我使用的权限: 服务器代码: Main Activity.java是: 请引导我。

  • 我已使用WebForms从VS-2019成功发布Azure应用服务。我已成功保护它,以便用户必须使用与应用服务相同域中的Azure AAD帐户登录。我已成功创建AzureSQL数据库。我已成功将AAD域中的用户添加到数据库中,并通过将我创建的Azure AAD帐户用户之一硬编码到连接字符串中,从Azure应用服务中连接到数据库。 现在,我想使用应用程序服务登录名中经过身份验证的AAD用户连接到Az

  • 我们有一个ASP经典Web应用程序在Azure应用服务中成功运行,该应用程序当前使用SQL服务器身份验证来访问AzureSQL数据库。我们需要将身份验证更改为Active Directory用户。我们设法使此应用程序从访问AzureSQL数据库的开发人员工作站工作,请参阅下面的工作和不工作。 *不适用于桌面,也不适用于Azure Conportail。打开"提供商=SQLOLEDB;服务器=tcp

  • 问题内容: 在Fedora 10上编译。 我刚刚启动了我的第一个qt GUI应用程序。我使用了所有默认设置。 它只是一个简单的形式。它构建良好,没有任何错误。但是当我尝试运行该应用程序时。我收到以下消息: 感谢您的任何建议, 问题答案: 造成这种情况的一般原因如下: 未在环境中设置DISPLAY。 解决方案 : (不过,这似乎不是错误的那个,因为它说X试图连接到它。而且,它并不总是0.0,但大多数