【问题标题】:How can read encrypted connection string in roleManager ASP.NET如何在 roleManager ASP.NET 中读取加密的连接字符串
【发布时间】:2012-10-10 19:13:09
【问题描述】:

请帮忙,我不知道如何在 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();

有人帮我找出来或有什么建议吗?

【问题讨论】:

  • 对不起,您可能不明白我的问题,我不谈论如何加密 ConnectionString 或将 Membership Provider 添加到现有数据库。我的问题是如何将 Encrypted ConnectionString 与 RoleManager 一起使用。你以前试过吗?
  • 我没有但不认为“connectionstring”可以有那种格式/语法。
  • :) 在帮助他人之前,您应该了解更多信息

标签: asp.net encryption web-config


【解决方案1】:

为什么不直接使用Protected Configuration?它是为您内置的。

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

【讨论】:

    【解决方案2】:

    我不确定这与您使用 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;
    

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

    【讨论】:

      【解决方案3】:

      @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
        }
      }
      

      web.config

       <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>
      

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        相关资源
        最近更新 更多