我可以通过Azure Data Studios登录。我已经经历了多个教程,不能让我的ASP.NET核心代码工作,以登录到数据库从应用程序服务或本地。我得到“用户''登录失败”。
我所采取的步骤。我的web API应用服务设置为托管身份。我已将此标识添加到grp-sqladmin中。我已经为sql数据库创建了一个应用程序服务,然后将托管身份设置为yes。我已经将sql db的admin设置为sql数据库服务器的active directory中的grp-sqladmin。然后,我使用以下命令将托管标识作为用户添加到SQL数据库:
CREATE USER [WebAPI] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [WebAPI];
ALTER ROLE db_datawriter ADD MEMBER [WebAPI];
ALTER ROLE db_ddladmin ADD MEMBER [WebAPI];
GO
然后,我在Web API中创建了连接字符串:
},
"ConnectionStrings": {
"AzureSqlConnection": "Server=tcp:blahblah.database.windows.net;Database=My DB; Authentication = Active Directory Default;"
},
我在获取访问令牌的dbContext中绘制了一个错误:
public class DbContext
{
private readonly IConfiguration _configuration;
private readonly string? _connectionString;
public DbContext(IConfiguration configuration)
{
_configuration = configuration;
_connectionString = _configuration.GetConnectionString("AzureSqlConnection");
}
public IDbConnection CreateConnection()
{
var conn = new SqlConnection(_connectionString);
var credential = new Azure.Identity.DefaultAzureCredential();
var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
conn.AccessToken = token.Token;
return conn;
}
}
当我为连接设置访问令牌时,它声明:“如果已在连接字符串中指定'Authentication',则无法设置AccessToken属性。”
然后,如果我去删除身份验证=Active Directory默认值,则会生成令牌并分配给连接,但当我运行查询时,我会得到错误:“用户''登录失败。”
我浪费了很多时间想弄明白为什么这不起作用。有什么想法吗?我的教程是这样的:https://learn.microsoft.com/en-us/azure/app-service/tutorial-connect-msi-sql-database?tabs=windowsclient%2Cef%2Cdotnet
public class CalendarRepository : ICalendarRepository
{
private readonly DbContext _context;
public CalendarRepository(DbContext context)
{
_context = context;
}
public async Task<IEnumerable<CalendarEvent>?> GetCalendarEvents()
{
try
{
var query = "SELECT * FROM CALENDAR";
using (var connection = _context.CreateConnection())
{
var events = await connection.QueryAsync<CalendarEvent>(query);
return events.ToList();
}
}
catch(Exception ex)
{
return null;
}
}
}
然而,我看过一些youtube视频,一些用户确实在他们的连接字符串末尾添加了身份验证项,所以这很令人困惑。我不确定这是否也是主要问题。
我在MS Graph API和Azure密钥库中使用托管身份,我很喜欢它,所以我也想把SQL DB的东西集成到身份中。我也使用系统分配的身份,如果这很重要的话。
我做az登录在cli和我登录使用我的帐户。我也包括在grp-sqlamin组,所以我认为它应该都是连接的。
1条答案
按热度按时间v6ylcynt1#
要通过系统分配的托管身份验证从Web API连接Azure sql数据库,请在Appsetting.json中以下面的格式提及连接字符串:
使用下面的代码进行连接。
设置管理员为sql server你想要的.
选择Azure服务认证的管理员帐户以检索令牌凭证。
参考图片:
在Azure应用程序服务的打开状态下启用系统分配的管理标识。
以管理员身份登录sql server,将用户添加到数据库并为用户分配角色
数据库已成功连接到应用程序。
参考图片: