我正在构建需要SQL数据库的桌面应用程序。我希望为客户提供2种选择:本地和云数据库。对于云数据库,我打算使用Azure SQL服务器。要求是:
我的问题是,在测试中,我遇到了“不允许IP地址连接到服务器”。这带来了一个问题:
听起来很奇怪,我找不到解决该问题的即用型解决方案。我是一个新程序员,也许谷歌还不够用……也就是说,这似乎是一个简单的问题,没有一个简单的明显解决方案。
我想出的最好的解决方案是应用程序中的嵌入式Open-VPN Client。但是,这似乎不必要地复杂。有更好的方法吗?
答案 0 :(得分:1)
为简单起见,在您的应用程序上使用基于令牌的身份验证。
public async Task<string> GetAccessTokenAsync(string clientId, string clientSecret, string authority, string resource, string scope)
{
var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
var clientCred = new ClientCredential(clientId, clientSecret);
var result = await authContext.AcquireTokenAsync(resource, clientCred);
if (result == null)
{
throw new InvalidOperationException("Could not get token");
}
return result.AccessToken;
}
使用令牌创建SQL连接。
public async Task<SqlConnection> GetSqlConnectionAsync(string tenantId, string clientId, string clientSecret, string dbServer, string dbName)
{
var authority = string.Format("https://login.windows.net/{0}", tenantId);
var resource = "https://database.windows.net/";
var scope = "";
var token = await GetTokenAsync(clientId, clientSecret, authority, resource, scope);
var builder = new SqlConnectionStringBuilder();
builder["Data Source"] = $"{dbServer}.database.windows.net";
builder["Initial Catalog"] = dbName;
builder["Connect Timeout"] = 30;
builder["Persist Security Info"] = false;
builder["TrustServerCertificate"] = false;
builder["Encrypt"] = true;
builder["MultipleActiveResultSets"] = false;
var con = new SqlConnection(builder.ToString());
con.AccessToken = token;
return con;
}
您甚至不必担心令牌过期,因为AzureServiceTokenProvider负责缓存。
在this文章中对其进行了解。
答案 1 :(得分:0)
您是否考虑过Azure防火墙?添加客户端IP或IP地址范围以限制Azure SQL数据库的访问。
防火墙设置:添加客户端IP或IP地址范围以提供对数据库的访问。
有关更多详细信息,请参见:
希望这会有所帮助。