我想找到一种利用 Azure 托管身份连接到 Azure SQL 数据库而无需密码的解决方案。
我已经根据以下文档在Azure上完成了设置。但是有两个问题。
这里有一些材料/代码,如果你也能给出一些解释,那就太好了。
我在 Visual Studio 中创建了一个 ASP.NET MVC Web 应用程序。我在
appsetting.json
文件中给出的连接字符串为:
"ConnectionStrings": {
"QuotesDatabase": "Server=tcp:<servename>.database.windows.net,1433; Database=<databasename>;" }
截图供参考:
我将以下包添加到项目中。
我添加了以下代码来连接到 Azure SQL 数据库:
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;
截图供参考:
我编写此查询是为了从 Azure SQL 数据库检索数据:
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Threading.Tasks;
namespace SqlMSI.Controllers
{
[ApiController]
[Route("[controller]")]
public class QuotesController : ControllerBase
{
private readonly string connectionString;
public QuotesController(SqlConnection dbconnection)
{
DbConnection = dbconnection;
}
public SqlConnection DbConnection { get; }
public async Task<IActionResult> Get()
{
DbConnection.Open();
var sqlCommand = new SqlCommand("select * from quote", DbConnection);
var reader = sqlCommand.ExecuteReader();
var quotes = new List<Quote>();
while (reader.Read())
{
var quote = new Quote()
{
Id = Guid.Parse(reader["Id"].ToString()),
QuoteNumber = int.Parse(reader["QuoteNumber"].ToString())
};
quotes.Add(quote);
}
return Ok(quotes);
}
}
public class Quote
{
public Guid Id { get; set; }
public int QuoteNumber { get; set; }
}
}
截图供参考:
我设置 Azure 服务身份验证来检索令牌凭据。
截图供参考:
我将自己设置为 SQL Server 的管理员。
截图供参考:
我将客户端IP地址添加到sql服务器 图片供参考:
它成功运行并连接到azure sql数据库并从数据库检索数据。
参考图片:
我将项目发布到Azure应用程序服务中
参考图片:
将azure中webapp的IP地址添加到sql服务器。
将系统分配的管理标识设置为 Azure 应用服务的状态。
我打开 SSMS 并使用活动目录密码选项登录服务器。
我使用以下代码创建了用户并向用户添加了角色
create user [quotes-app] from external provider;
alter role db_datareader add member [quotes-app];
alter role db_datawriter add member [quotes-app];
参考图片:
无需使用用户 ID 密码即可成功连接到应用程序。
参考图片: