我在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添加端点,更不用说创建一个实际的应用程序来使用它了,这太可笑了。
答案 0 :(得分:2)
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
创建,访问和使用令牌