我有一个包含100个用户和密码的现有表。数据类型是varchar。 我刚刚创建了一个asp.net mvc应用程序,我想将密码转换为aspnet_membership表。
如何在SQL级别上将varchar密码转换为aspnet_membership表中的“Password”和“Passwordsalt”?
答案 0 :(得分:19)
密码& PasswordSalt部件未在“SQL级别”处理和创建 如果仔细查看asp.net成员资格数据库 - 表/存储过程/其他对象。然后你会发现有两个存储过程(简称sp)在asp.net成员数据库表中创建User。
这些sps将在aspnet_Membership& aspnet_Users表分别。 ASP.Net成员身份适用于您设置的web.config文件设置。 一个示例默认webconfig条目将是这样的:
<authentication mode="Forms"> // If you are using Form authentication
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" passwordFormat="Encrypted" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
在此设置部分中,属性“passwordFormat”设置用户密码的存储方式。 选项包括 - 清除(0),散列(1),加密(2)
默认情况下,它将具有散列值 - 或者如果你没有指定passwordFormat。
在明文中,密码将保存为 - 文字清晰 - 可读。
使用Hashed选项,密码不会(加密),只能使用Hashing算法进行编码
使用“加密”选项,密码将被加密,然后进行编码。
加密选项u指定非自动生成的“机器密钥” 要查看:Get a non-autogenerated machine key
密码盐是一个随机生成的字符串,用于加密和编码密码以及验证和密码。解密密钥。
如果你想覆盖asp.net会员提供商的加密方法并对自己进行编码,(如果使用自定义会员提供商),你可以这样做:
private string EncodePassword(byte passFormat, string passtext, string passwordSalt)
{
if(passFormat.Equals(0)) // passwordFormat="Clear" (0)
return passtext;
else{
byte[] bytePASS = Encoding.Unicode.GetBytes(passtext);
byte[] byteSALT = Convert.FromBase64String(passwordSalt);
byte[] byteRESULT = new byte[byteSALT.Length + bytePASS.Length + 1];
System.Buffer.BlockCopy(byteSALT, 0, byteRESULT, 0, byteSALT.Length);
System.Buffer.BlockCopy(bytePASS, 0, byteRESULT, byteSALT.Length, bytePASS.Length);
if(passFormat.Equals(1)) // passwordFormat="Hashed" (1)
{
HashAlgorithm ha = HashAlgorithm.Create(Membership.HashAlgorithmType);
return (Convert.ToBase64String(ha.ComputeHash(byteRESULT)));
}
else // passwordFormat="Encrypted" (2)
{
MyCustomMembership myObj = new MyCustomMembership();
return(Convert.ToBase64String(myObj.EncryptPassword(byteRESULT)));
}
}
}
使用示例:
string passSalt = // Either generate a random salt for that user, or retrieve the salt from database if the user is in edit and has a password salt
EncodePassword(/* 0 or 1 or 2 */, passwordText, passSalt);
我希望这会有所帮助。
答案 1 :(得分:0)
它在SQL级别上是不可能的,但是对于一些C#代码,有两种可行的技术。
最简单的方法是编写一个流程来读取现有表格,并为每个用户调用Membership.CreateUser
,会员提供商将为您创建用户记录,包括密码和密码。盐
或者,创建一个虚拟用户,然后编写一个进程以将虚拟用户的密码更改为现有用户的值,并从aspnet_membership表中读取值。如果您有兴趣,我有代码可以执行此操作。
答案 2 :(得分:0)
HashAlgorithm ha = HashAlgorithm.Create(Membership.HashAlgorithmType);
如果null意味着如何抛出异常
,如何检查ha是否为null