请帮助,我不知道如何在ASP.NET中使用带有RoleManager的加密ConnectionString 这是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>
在项目中我创建了一个库来阅读web配置
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();
任何人帮我找到它或任何建议?
答案 0 :(得分:0)
为什么不使用Protected Configuration?它是为你而内置的。
如果你真的想使用自己的,你是如何创建加密字符串的?我假设您使用的是this one之类的第三方库,因为该方法不存在于System.Security命名空间中。我的猜测是你以提供密钥的方式对其进行加密,但是在解密时,你不是使用相同的密钥,或者解密方法就是破解。如果不了解更多关于图书馆的信息,真的很难说。
答案 1 :(得分:0)
我不确定这与您使用角色会员资格提供商的事实有关。
在解密值之前,您要求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;
你应该将它包装在一些异常处理中,但我希望你明白这一点。
答案 2 :(得分:0)
@SilverbackNet:是的,看起来和你说的一样,在库里我有一个带有Encrypt和Decrypt方法的类安全性。当使用我的SQLHelper连接到DB时获取配置值并解密它。所有项目都没有问题。但是当我使用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>