通过托管标识将ASP.NET Core Web API连接到Azure SQL Server

wfveoks0  于 2023-06-30  发布在  .NET
关注(0)|答案(1)|浏览(149)

我可以通过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组,所以我认为它应该都是连接的。

v6ylcynt

v6ylcynt1#

要通过系统分配的托管身份验证从Web API连接Azure sql数据库,请在Appsetting.json中以下面的格式提及连接字符串:

"ConnectionStrings": {
        "QuotesDatabase": "Server=tcp:<servename>.database.windows.net,1433; Database=<databasename>;" }

使用下面的代码进行连接。

var connectionString = Configuration.GetConnectionString("<connectionstringname>");
                services.AddTransient(a =>{
                    var sqlConnection = new SqlConnection(connectionString);
                    var credential = new DefaultAzureCredential();
                    var token = credential
                            .GetToken(new Azure.Core.TokenRequestContext(
                                new[] { "https://database.windows.net/.default" }));
                    sqlConnection.AccessToken = token.Token;
                    return sqlConnection;

设置管理员为sql server你想要的.

选择Azure服务认证的管理员帐户以检索令牌凭证。
参考图片:

在Azure应用程序服务的打开状态下启用系统分配的管理标识。

以管理员身份登录sql server,将用户添加到数据库并为用户分配角色

create user [<appName>] from external provider;
alter role db_datareader add member [<appName>];
alter role db_datawriter add member [<appName>];

数据库已成功连接到应用程序。
参考图片:

相关问题