我有一个首先设置和工作的ef6代码的WebAPI。在应用开始时,我们有dbmigrator.Update()
,它将任何待处理的迁移应用于数据库。
更改连接字符串以删除用户名和密码并改为提供访问令牌后,dbmigrator.Update()
失败并显示错误:
用户''
登录失败
如何确保dbmigrator在连接字符串中使用Azure SQL访问令牌而不是用户名/密码?
修改1:
对dbcontext构造函数所做的更改是从
更改它DbContext() : base("nameofConnString"){}
到
DbContext() : base(GetSQLConn(), true)
{
Database.SetInitializer<DbContext>(null);
}
使用GetSQLConn()
,我正在检索没有uname / pwd的连接并将accesstoken附加到它并返回连接!
编辑2:
private static SqlConnection GetSQLConn()
{
var accessToken = TokenFactory.AcquireToken();
var connString = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;
var conn = new SqlConnection(connString)
{
AccessToken = accessToken,
};
return conn;
}
答案 0 :(得分:0)
如何确保dbmigrator在连接字符串中使用Azure SQL访问令牌而不是用户名/密码?
实际上dbcontext适用于我所有表的CRUD操作,只是这个迁移器不起作用!
根据您的评论,您似乎无权提醒表格。如果您没有为创建的用户授予相应的权限。 请尝试向创建的用户授予权限。有关db角色的更多详细信息,请参阅Database-Level Roles。
EXEC sp_addrolemember N'db_owner', N'your-user-name'
我也关注你提到的SO thread。如果我将用户添加到do_owner,我会用Alter Table进行测试,它可以正常使用。以下是我的详细步骤。
1。Registry an Azure AD Application
2.为Azure SQL服务器提供Azure Active Directory管理员,更多详细信息,请参阅此tutorials
3.为Azure SQL创建用户并授予相应的权限。
CREATE USER [RegistryAppName] FROM EXTERNAL PROVIDER
EXEC sp_addrolemember N'db_owner', 'RegistryAppName'
4.更改demo code并按预期运行。
SqlConnectionStringBuilder builder =
new SqlConnectionStringBuilder
{
["Data Source"] = "azureServername.database.windows.net",
["Initial Catalog"] = "databaseName",
["Connect Timeout"] = 30
};
// replace with your server name
// replace with your database name
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;
connection.Open();
var commentText = "ALTER TABLE AccountRec ADD newColumn varchar(10) ";
SqlCommand sqlCommand = new SqlCommand(commentText, connection);
Console.WriteLine("Executed Result:" + sqlCommand.ExecuteNonQuery());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.WriteLine("Please press any key to stop");
Console.ReadKey();