我在Azure中有一个应用程序服务,用作我正在设计的系统的API。由于API负责直接访问数据库,因此我显然不想在任何可能的地方存储包含凭据的连接字符串,因此希望使用托管身份向App Service授予对数据库的访问权限(也托管在Azure上) 。
在Azure门户中,我已在App Service的“设置”部分中启用了系统分配的身份,然后通过SQL Server->访问控制->角色分配->添加,为该服务赋予SQL Server所有者的角色。
据我了解,Active Directory用户甚至不应该参与其中,因为它们是用户分配的身份而不是系统分配的身份,并且需要进行更多设置(或将其凭据存储在连接字符串中)。
至于代码,它几乎是此版本的副本>> https://github.com/medhatelmasry/JwtAuthentication,唯一的区别是我添加了
services.BuildServiceProvider().GetService<ApplicationDbContext>().Database.Migrate();
至中ConfigureServices
方法的末尾Startup.cs
,并ApplicationDbContext
按照Microsoft的说明将以下内容添加到的构造函数中:
var conn = (System.Data.SqlClient.SqlConnection)Database.GetDbConnection();
conn.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
但是,当尝试在Azure中运行此服务时,在调用时出现异常services.BuildServiceProvider().GetService<ApplicationDbContext>().Database.Migrate();
:
用户“ NT AUTHORITY \ ANONYMOUS LOGON”的登录失败
我已经尝试过StackOverflow,MSDN,Azure帮助,Pluralsight以及Google出现的任何随机论坛,但都没有找到任何答案。我只熬了整整一个星期,直到每天愚蠢的时间试图修复连接字符串配置,才发现Azure正在更改我给它的连接字符串参数的名称,而不是说它(也没有任何Microsoft文档中的内容)。
Azure正在使我痛苦不堪,我什至还没有开始向API添加端点,更不用说创建一个实际的应用程序来使用它了,这太荒谬了。
App Service确实已设置为服务器的所有者,但尚未在数据库上配置用户,因此我的问题通过通过SSMS登录数据库并运行来解决:
CREATE USER [My App Service Name] FROM EXTERNAL PROVIDER
然后:
ALTER ROLE db_owner ADD MEMBER [My App Service Name]
但是,我在服务器的访问控制(IAM)页面上删除了App Service的所有权角色,并且仍然能够成功连接,不确定为什么会这样,但这可能只是我缺乏SQL用户知识。实际上,这很适合我,因为目前我的App Service具有一个预配置的SQL用户,db_owner
该用户在数据库本身而不是在整个服务器上分配了角色。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句