use*_*610 6 entity-framework azure-active-directory adal
我们有连接到 SQL Azure DB 的 Web 应用程序。我已使用应用程序 ID 和证书配置了我的应用程序。我们希望利用访问令牌方法连接到 SQL Server,根据下面的链接,通过令牌方法连接到 SQL Server 并不是一种可靠的方法。任何推荐的连接方式,而不是用户 ID 和密码。
使用 Azure Active Directory 从 Azure 网站连接到 Azure SQL?
谁能告诉我他们是否使用实体框架实现了基于 SQL Azure DB AAD 令牌的身份验证,并且这是正确的连接方式。
根据您的描述,我遵循了有关对 Azure SQL 数据库使用 AAD 身份验证的教程。
正如本教程提到的有关Azure AD 令牌身份验证的内容:
此身份验证方法允许中间层服务通过从 Azure Active Directory (AAD) 获取令牌来连接到 Azure SQL 数据库或 Azure SQL 数据仓库。它支持复杂的方案,包括基于证书的身份验证。您必须完成四个基本步骤才能使用 Azure AD 令牌身份验证:
- 向 Azure Active Directory 注册您的应用程序并获取代码的客户端 ID。
- 创建代表应用程序的数据库用户。(之前已在步骤 6 中完成。)
- 在运行应用程序的客户端计算机上创建证书。
- 添加证书作为您的应用程序的密钥。
然后我按照本博客中的代码示例开始使用此功能,并且它按预期工作。
谁能告诉我他们是否使用实体框架实现了基于 SQL Azure DB AAD 令牌的身份验证,并且这是正确的连接方式。
基于上面的代码示例,我添加了EntityFramework 6.1.3,以使用实体框架实现基于 SQL Azure DB AAD 令牌的身份验证。经过一番尝试,我可以让它按预期工作。这里有一些细节,你可以参考一下。
数据库上下文
public class BruceDbContext : DbContext
{
public BruceDbContext()
: base("name=defaultConnectionString")
{ }
public BruceDbContext(SqlConnection con) : base(con, true)
{
Database.SetInitializer<BruceDbContext>(null);
}
public virtual DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
数据模型
[Table("Users")]
public class User
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[StringLength(50)]
public string UserName { get; set; }
public DateTime CreateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
程序.cs
class Program
{
static void Main()
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder["Data Source"] = "brucesqlserver.database.windows.net";
builder["Initial Catalog"] = "brucedb";
builder["Connect Timeout"] = 30;
string accessToken = TokenFactory.GetAccessToken();
if (accessToken == null)
{
Console.WriteLine("Fail to acuire the token to the database.");
}
using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
{
try
{
connection.AccessToken = accessToken;
//working with EF
using (var model = new BruceDbContext(connection))
{
var users= model.Users.ToList();
Console.WriteLine($"Results:{Environment.NewLine}{JsonConvert.SerializeObject(users)}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.WriteLine("Please press any key to stop");
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
结果
注意:您的应用程序主体所包含的数据库用户CREATE USER [mytokentest] FROM EXTERNAL PROVIDER没有任何访问您的数据库的权限。您需要为该用户授予权限,更多详细信息可以参考这个问题。
此外,当您构造DbContext实例时,您需要使用SqlConnection有效的AccessToken. AFAIK,当令牌过期时,您需要处理令牌刷新。
| 归档时间: |
|
| 查看次数: |
8708 次 |
| 最近记录: |