4

请帮助,我不知道如何在 ASP.NET 中使用加密的 ConnectionString 和 RoleManager这是 Web.config 中的代码。

<connectionStrings>
    <add name="strConnectionString" connectionString="eF8w9r2UJOsk0Ps3pxmV7/Fy/xPR2hN2S7BrC1iOYNnAUaI8AqkSm5bw7r+ta4sePWSV9t/3Spnpz6wsFpvMmcppNpqM5Zk7iiDqWVgIV4k="/>    
</connectionStrings>

<roleManager enabled="true" defaultProvider="CustomizedRoleProvider">
  <providers>
    <add connectionStringName="strConnectionString" name="CustomizedRoleProvider" type="System.Web.Security.SqlRoleProvider" />
  </providers>
</roleManager>   
<membership defaultProvider="CustomizedMembershipProvider">
  <providers>
    <add connectionStringName="strConnectionString" name="CustomizedMembershipProvider" type="System.Web.Security.SqlMembershipProvider"/>
  </providers>
</membership>

在项目中,我创建了一个库来读取网络配置

private const string ConnectionStringKey = "strConnectionString";
private readonly string SQLConnectionString =
   Security.DecryptString(ConfigurationManager.ConnectionStrings[ConnectionStringKey].ConnectionString);

如果我像这样更改我的 ConnectionString,它正在工作

 <add name="strConnectionString" connectionString="server=My-PC\\MSSQL2008; database=MyDB; uid=sa; pwd=passw0rd;"/>

但我希望我的 ConnectionString 加密所以我使用

<add name="strConnectionString" connectionString="eF8w9r2UJOsk0Ps3pxmV7/Fy/xPR2hN2S7BrC1iOYNnAUaI8AqkSm5bw7r+ta4sePWSV9t/3Spnpz6wsFpvMmcppNpqM5Zk7iiDqWVgIV4k="/> 

所以当我运行网站时,它会抛出错误:

System.ArgumentException:Keyword not supported: 'eF8w9r2UJOsk0Ps3pxmV7/Fy/xPR2hN2S7BrC1iOYNnAUaI8AqkSm5bw7r+ta4sePWSV9t/3Spnpz6wsFpvMmcppNpqM5Zk7iiDqWVgIV4k='.
Line 46:   string[] roleNames;
Line 47:   roleNames = Roles.GetAllRoles();

任何人帮助我找出它或任何建议?

4

3 回答 3

0

为什么不只使用受保护的配置?它是为您内置的。

如果您真的想使用自己的,您是如何创建加密字符串的?我假设您正在使用像这样的第三方库,因为 System.Security 命名空间中不存在该方法。我的猜测是您以提供密钥的方式对其进行了加密,但是在解密时,您没有使用相同的密钥,或者 Decrypt 方法被破坏了。如果不了解更多关于图书馆的信息,真的很难说。

于 2012-10-22T23:46:04.810 回答
0

@SilverbackNet:是的,看起来和你说的一样,在库中我有一个具有加密和解密方法的类安全性。当连接到数据库时,我使用我的 SQLHelper 获取配置值并解密它。所有项目工作都没有问题。但是当我使用 Role 和 Membership 时,我发现不能使用默认配置 RoleManager 和 Membership,正如你所说的 System.Security 命名空间中不存在读取 ConnectionString Encrypted 的方法。所以我应该用另一种方法来重新创建 RoleProvider 和 MembershipProvider 覆盖所有方法。在Web.config将是这样的变化:

namespace Library.Roles
{
  public class MyRoleProvider : RoleProvider
  {
     //code override all method in Roles
  }
}

namespace Library.Membership
{
  public class MyMembershipProvider : MembershipProvider
  {
     //code override all method in MembershipProvider
  }
}

网络配置

 <roleManager enabled="true" defaultProvider="MyRoleProvider">
      <providers>
        <add connectionStringName="strConnectionString" name="MyRoleProvider" type="Library.Roles.MyRoleProvider" />
      </providers>
    </roleManager>   
    <membership defaultProvider="MyMembershipProvider">
      <providers>
        <add connectionStringName="strConnectionString" name="MyMembershipProvider" type="Library.Membership.MyMembershipProvider"/>
      </providers>
    </membership>
于 2012-10-23T06:42:55.573 回答
0

我不确定这与您使用 Roles Membership 提供程序的事实有关。

ConnectionStringSettings您在解密值之前要求一个对象;

ConfigurationManager.ConnectionStrings[ConnectionStringKey].ConnectionString

该代码试图自动解析它通常会在未加密的连接字符串中找到的关键字对。您遇到的错误是它无法识别关键字,因为您的加密版本没有任何关键字对。

您需要获取配置值,对其进行解密,然后创建ConnectionStringSettings它所代表的对象。然后,您可以从中访问该ConnectionString属性。

假设您的解密方法可以访问必要的加密密钥,请尝试这样的操作;

  string ConnectionStringKey = "strConnectionString";
  string encryptedConnection = ConfigurationManager.ConnectionStrings[ConnectionStringKey].ToString();
  string unencryptedConnection = Security.DecryptString(encryptedConnection);

  ConnectionStringSettings connection = new ConnectionStringSettings("SQL", unencryptedConnection);
  string SQLConnectionString = connection.ConnectionString;

您可能应该将其包装在一些异常处理中,但我希望您明白这一点。

于 2012-10-23T00:33:29.673 回答