[英]Read custom encrypted connection string from Web.config
我有一个现有的 ASP.NET 项目,其中连接字符串通过使用 C# 中的自定义加密函数在 Web.config 文件中加密,并将加密的字符串保存到 Web.config 文件中,如下所示...
<add name="ConnectionString" connectionString="+tj/H0V/Wpa+UBWzHvOfuL4GPyoDssypPKfeRdUU1FnfHw+phOEBLpRne/ytv1v8gs7P0DoSC7rhN2aPWG3uZZvSis5f/Dqu53HgsRH8m44=" providerName="System.Data.SqlClient" />
我现在想用一个需要 SQLDataSource 的控件向这个项目添加一个页面,并且我在后面的 .aspx 代码中指定了 ConnectionString,作为 SQLDataSource 的属性,如下所示......
<asp:SqlDataSource ID="PeriodsDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
这显然现在正在尝试读取 connectionString,但获取加密字符串,并引发错误...
“不支持关键字:'+tj/h0v/wpa+ubwzhvoful4gpyodssyppkferduu1fnfhw+phoeblprne/ytv1v8gs7p0dosc7rhn2apwg3uzzvsis5f/dqu53hgsrh8m44'。”
如何将 ConnectionString 传递给我的自定义 Encryption.Decrypt 函数,以便 SQLDataSource 使用未加密的字符串?
我曾尝试简单地将以下内容添加到 Page_Load 事件中,这有助于初始加载,但在回发后我仍然收到上述错误。 (不,这不在 !IsPostBack 内)
string connectionString = Encryption.Decrypt(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, "XXXXXX");
PeriodsDataSource.ConnectionString = connectionString;
这是我已经实施的解决方案。
asp:SqlDataSource
ConnectionString
的%$
字符意味着它是一个表达式并因此计算。 我们可以创建自己的自定义表达式。
创建一个class
像这样的扩展ExpressionBuilder
namespace YourNameSpace
{
[ExpressionPrefix("EncryptedExpressionStrings")]
public class EncryptedConnectionStringExpressionBuilder : ExpressionBuilder
{
private static string DecryptConnectionString(string cipherText)
{
return Encryption.Decrypt(cipherText);
}
public static ConnectionStringSettings GetConnectionStringSettings(string connectionStringName)
{
return ConfigurationManager.ConnectionStrings[connectionStringName];
}
public static string GetConnectionString(string connectionStringName)
{
string decryptedConnectionString = null;
System.Web.Caching.Cache connectionStringCache = new System.Web.Caching.Cache();
if (connectionStringCache["connectionString"] == null)
{
ConnectionStringSettings settings = GetConnectionStringSettings(connectionStringName);
decryptedConnectionString = DecryptConnectionString(settings.ConnectionString);
connectionStringCache.Insert("connectionString", decryptedConnectionString);
}
else
{
decryptedConnectionString = (string)connectionStringCache["connectionString"];
}
return decryptedConnectionString;
}
public static string GetConnectionStringProviderName(string connectionStringName)
{
ConnectionStringSettings settings = GetConnectionStringSettings(connectionStringName);
return settings.ProviderName;
}
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
Pair pair = DirectCast<Pair>(parsedData);
string text = pair.First.ToString();
if (Convert.ToBoolean(pair.Second))
{
return new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "GetConnectionString", new CodeExpression[] { new CodePrimitiveExpression() { Value = text } });
}
else
{
return new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "GetConnectionStringProviderName", new CodeExpression[] { new CodePrimitiveExpression() { Value = text } });
}
static T DirectCast<T>(object o) where T : class
{
T value = o as T;
if (value == null && o != null)
{
throw new InvalidCastException();
}
return value;
}
}
并且您必须在web.config
声明新的自定义ExpressionBuilder
<compilation>
<expressionBuilders>
<add expressionPrefix="EncryptedExpressionStrings" type="YourNameSpace.EncryptedConnectionStringExpressionBuilder"/>
</expressionBuilders>
</compilation>
然后你声明你的 connectionString 是加密的
<connectionStrings>
<add name="EncryptedSqlDBConnectionString" connectionString="nWCfxsad8lkdyLWERODVxd3Ox..."
</connectionStrings>
然后在 web.config 中为自定义ExpressionBuilder
声明前缀的名称,并在asp:SqlDataSource
ConnectionString
的名称
<asp:SqlDataSource runat="server" ID="YourID" ConnectionString="<%$ EncryptedExpressionStrings:EncryptedSqlDBConnectionString %>" SelectCommand="SELECT * FROM YourDBTable" />
这意味着您可以在web.config
加密连接 String 并仍然评估asp.SqlDataSource
connectionString
。
原来是在SqlDataSource的Init事件中更新SqlDataSource.ConnectionString的一个很简单的解决方案,如下:
protected void SqlDataSource_Init(object sender, EventArgs e)
{
string connectionString = Encryption.Decrypt(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, "XXXXXX");
SqlDataSource.ConnectionString = connectionString;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.