保护共享主机上的连接字符串

时间:2017-01-03 17:42:21

标签: c# asp.net encryption asp.net-mvc-5 web-config

我正在使用MVC5创建一个网站& EF6。我也使用共享主机来发布这个网站。现在我遇到的问题是我的连接字符串当前是在web.config文件中的纯文本中。我很难找到"直接"回答我应该如何解决这个问题。

我发现了许多文章,例如this one。本文向我展示了如何加密web.config的Connection部分。所以我尝试按照它的示例并加密它在该示例中显示的邮件部分。运行我的代码后,我注意到我的整个web.config文件发生了变化。

它是这样的:

<system.net>
  <mailSettings>
    <smtp from="info@Site.com">
      <network
        host="mail.Site.com"
        port="25"
        userName="info@site.com"
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

现在是这样的:

<mailSettings>
  <smtp configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>Rsa Key</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>odapFFPDF1Fgsk2wyvbwVC4SNISqhWc9lXiAq+I/OW3wVVqBCPowxyen9M7c9+KUBkXmGSfaUVxDMlqutChv6g6VU8h4TWG3W6Tw/istjfw/UYrRsGguPiOqdvRsl9XLBmnS37v99+VX7FEA9TKb6ufC0a3Defp2MNpGTvTIR20=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>lHPPFRJAH2hIm/Ya+ABRMP5mo5rEYwL2aBJQ/DT4Q+1OZXaftutiddxxJZ4LSgw3pzi1QJpU8eOPwFVebvqFVA4cjs27l8Iqz50E/R/tBfS7e2oqdWTRsc8IFfE/xOIieMp22BuFsYEDbgnIbLdbHJnw+92zyt2lUlzJpW9epNpnb29sVQhtNJ9cPjAaYAaU</CipherValue>
      </CipherData>
    </EncryptedData>
  </smtp>
</mailSettings>

我现在唯一的问题是如何在我的代码中读取这些值而无需解密并保存配置文件。我不想在我需要阅读邮件设置部分甚至连接字符串部分时重写webconfig文件。

如果我有这样的方法:

public static string DecryptMailSettings()
{
    var config = WebConfigurationManager.OpenWebConfiguration("~");
    ConfigurationSection section = config.GetSection("system.net/mailSettings/smtp");
    if (section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        return section.???;
    }
    return "Nothing was read";
}

我怎样才能获得值得说的话#&#34; host&#34;从上面的例子中可以看出。

2 个答案:

答案 0 :(得分:3)

来自文档:

ASP.NET在处理文件时自动解密Web.config文件的内容。因此,无需其他步骤即可解密加密配置设置以供其他ASP.NET功能使用或访问代码中的值。

https://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

答案 1 :(得分:0)

我建议如果加密/解密工作正常,并且看起来“解开”主机名很麻烦,那么只需在web.config中添加一个值。

喜欢这个:     <appSettings> <add key="MAILHOST" value="mail.Site.com" />, 然后在你的代码中读取它。

例如:

string HostName = ConfigurationManager.AppSettings["MAILHOST"].ToString();