将内部Windows应用程序(.net 4.6.1)的用户使用Windows身份验证,然后将AD Integrated Authentication连接到MS SQL数据库,该应用程序已迁移到Azure。
理想情况下,应该保留现有的安全机制,即向AD用户授予数据库对象的权限,并让DB成为应用程序的安全源。
已经创建并配置了SQL数据库的副本。
如果我在本地运行Web应用程序,但使用新的Azure数据库,则一切正常。
如果运行此命令,我将获得预期的AD用户:
SELECT CURRENT_USER;
现在,当我将完全相同的应用程序部署到Azure App Service并启用Azure Active Directory身份验证和托管服务身份时,将在Web应用程序上正确验证用户,但无法连接到SQL数据库和返回以下错误:
错误= System.Data.SqlClient.SqlErrorCollection ClientConnectionId = e9f0c48a-3159-465c-ab72-c1da99761b8f类= 14行号= 65536 号码= 18456程序=服务器= xxxxxxxxxxx.tr4.canadacentral1-a.worker.database.windows.net,11057 状态= 1源= .Net SqlClient数据提供程序ErrorCode = -2146232060消息=用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败
如果我禁用托管服务身份,则会收到此错误:
InnerExceptions = System.Collections.ObjectModel.ReadOnlyCollection`1 [System.Exception] 消息=发生一个或多个错误。数据= System.Collections.ListDictionaryInternal InnerException = Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: 参数:连接字符串:[未指定连接字符串], 资源:https://database.windows.net/,权限:。例外 消息:尝试了以下4种方法来获取访问令牌,但是 他们都没有工作。参数:连接字符串:[无连接 指定的字符串],资源:https://database.windows.net/,权限: 。异常消息:尝试使用托管服务获取令牌 身份。无法连接到托管服务标识(MSI) 端点。请检查您是否正在运行的Azure资源上运行 具有MSI设置。参数:连接字符串:[无连接字符串 指定],资源:https://database.windows.net/,权限:。 异常消息:尝试使用Visual Studio获取令牌。访问 无法获取令牌。没有Visual Studio令牌提供程序文件 发现于 “ D:\ local \ LocalAppData.IdentityService \ AzureServiceAuth \ tokenprovider.json” 参数:连接字符串:[未指定连接字符串], 资源:https://database.windows.net/,权限:。例外 消息:试图使用Azure CLI获取令牌。存取凭证不能为 获得。无法将“ az”识别为内部或外部命令, 可操作的程序或批处理文件。参数:连接字符串:[否 指定的连接字符串],资源:https://database.windows.net/, 权限:https://login.microsoftonline.com/common。例外 消息:试图使用Active Directory Integrated获取令牌 身份验证。无法获取访问令牌。 get_user_name_failed:无法获取用户名内部异常: 指定域名的格式无效 Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.d__14.MoveNext()
这是我想做的可能吗?如果是,我想念什么?任何想法将不胜感激。
作为参考,这是返回SQL连接的方法:
private SqlConnection GetSqlConnection()
{
var accessToken = new AzureServiceTokenProvider().GetAccessTokenAsync("https://database.windows.net/").Result;
return new SqlConnection
{
ConnectionString = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString,
AccessToken = accessToken
};
}
...这是连接字符串:
<connectionStrings>
<add name="Default" connectionString="Data Source=myserver.database.windows.net;Initial Catalog=MyDB;" providerName="System.Data.SqlClient" />
</connectionStrings>
注意:本地AD已与其Azure AD副本同步。
答案 0 :(得分:1)
我认为要解决您的问题,您必须执行以下操作:
{application-name}/slots/{slot-name}
Server=tcp:{server}.database.windows.net,1433;Initial Catalog={DatabaseName};Persist Security Info=False;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Authentication='Active Directory Interactive'
。这也适用于EntityFramework,但是如果直接在Azure中设置连接字符串,则需要选择Custom
而不是SqlAzure
作为提供程序。答案 1 :(得分:1)
确保已在Azure SQL中添加了身份用户并授予了必需的特权。
从外部提供者创建用户[MyAppIdentity] 走 更改角色db_datareader添加成员[MyAppIdentity]; 更改角色db_datawriter添加成员[MyAppIdentity];
答案 2 :(得分:0)
部署应用程序后,请将您的应用程序设置和连接字符串放在Azure上的webapp MyService.BUS.observe(this, Observer {
it?.let {
// Do what you need to do here
}
})
选项中。请参阅此article。
注意:它已从Azure App Service的– Application Settings
刀片中配置的“应用程序设置”中拉出了值,而不是从Application Settings
文件中拉出了值。这样,您可以随时更改这些可配置的值,而无需依赖开发人员。相同的规则甚至适用于Web.config
。