Azure App Service无法访问SQL Server-用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败

时间:2019-08-26 00:04:51

标签: c# azure azure-sql-database azure-managed-identity

我在Azure中有一个应用程序服务,它作为我正在设计的系统的API。由于API负责直接访问数据库,因此我显然不想在任何可能的地方存储包含凭据的连接字符串,因此我希望使用托管身份向App Service授予对数据库的访问权限(也托管在Azure上)

在Azure门户中,我已在App Service的“设置”部分中启用了系统分配的身份,然后通过SQL Server->访问控制->角色分配->为该服务赋予了SQL Server所有者的角色添加。

据我所知,Active Directory用户甚至不应该进入此目录,因为它们是用户分配的身份而不是系统分配的身份,并且需要进行更多设置(或将其凭据存储在连接字符串中)。

对于代码,它几乎是此>> https://github.com/medhatelmasry/JwtAuthentication的副本,唯一的区别是我添加了

state.checkpoints.dir

services.BuildServiceProvider().GetService<ApplicationDbContext>().Database.Migrate(); ConfigureServices方法的末尾,并按照Microsoft的说明将以下内容添加到Startup.cs的构造函数中:

ApplicationDbContext

但是,当尝试在Azure中运行此服务时,在调用var conn = (System.Data.SqlClient.SqlConnection)Database.GetDbConnection(); conn.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result; 时出现异常:

  

用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败

我已经尝试了StackOverflow,MSDN,Azure帮助,Pluralsight以及Google出现的任何随机论坛,但都没有找到任何答案。我只熬了整整一个星期,直到每天愚蠢的时候才试图修复连接字符串配置,却发现Azure正在更改我给它的连接字符串参数的名称,而不是说它(在任何有关它的Microsoft文档中也没有)。

Azure变得非常痛苦,我什至还没有开始向API添加端点,更不用说创建一个实际的应用程序来使用它了,这太可笑了。

2 个答案:

答案 0 :(得分:2)

最终在这里找到了答案>> https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql#create-a-contained-user-in-the-database-that-represents-the-vms-system-assigned-identity

App Service确实已设置为服务器的所有者,但是没有在数据库上设置用户,因此我的问题通过登录进入得以解决通过SSMS数据库并运行:

derivedStruct

然后:

derivedClass::printDataSize()

但是,我在服务器的访问控制(IAM)页面上删除了App Service的所有权角色,并且仍然能够成功连接,不确定为什么会这样,但这可能只是我缺乏SQL用户知识部分。实际上,这很适合我,因为目前我的App Service在数据库本身(而不是整个服务器)上分配了具有CREATE USER [My App Service Name] FROM EXTERNAL PROVIDER角色的预配置SQL用户。

答案 1 :(得分:0)

根据我的理解,您必须完成创建,启用和允许Azure AD用户以及将SQL Admin设置为Azure AD用户的先决过程。

这里有一个相当全面的指南,包括为托管身份Tutorial: Secure Azure SQL Database connection from App Service using a managed identity

创建,访问和使用令牌