创建密码和密码

时间:2010-09-20 16:00:13

标签: asp.net asp.net-mvc

我有一个包含100个用户和密码的现有表。数据类型是varchar。 我刚刚创建了一个asp.net mvc应用程序,我想将密码转换为aspnet_membership表。

如何在SQL级别上将varchar密码转换为aspnet_membership表中的“Password”和“Passwordsalt”?

3 个答案:

答案 0 :(得分:19)

密码& PasswordSalt部件未在“SQL级别”处理和创建 如果仔细查看asp.net成员资格数据库 - 表/存储过程/其他对象。然后你会发现有两个存储过程(简称sp)在asp.net成员数据库表中创建User。

  1. aspnet_Membership_CreateUser
  2. aspnet_Users_CreateUser
  3. 这些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