会员资格生成密码仅限字母数字密码?

Cur*_*ite 35 regex membership asp.net asp.net-membership

如何使用Membership.GeneratePassword返回仅包含字母或数字字符的密码?默认方法仅保证最小数量而非最大数量的非字母数字密码.

Cur*_*ite 57

string newPassword = Membership.GeneratePassword(15, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9" );
Run Code Online (Sandbox Code Playgroud)

此正则表达式将使用数字字符9替换所有非字母数字字符.

  • 使用10作为最大值,因为上限是在"Random.Next"方法中独占的.`string newPassword = Membership.GeneratePassword(8,0); 随机rnd = new Random(); newPassword = Regex.Replace(newPassword,@"[^ a-zA-Z0-9]",m => rnd.Next(0,10).ToString());` (12认同)
  • @Matti可以用Random.Next(0,9)整数替换"9".将非字母数字字符放入典型密码通常是过度的.对于许多应用程序,随机生成的密码不使用单词.这样做的原因是可用性.许多非字母数字字符很容易被误解或混淆,或者普通用户无法输入. (11认同)

小智 15

获取8个字符的字母数字密码的简单方法是生成一个guid并使用它作为基础:

string newPwd = Guid.NewGuid().ToString().Substring(0, 8);
Run Code Online (Sandbox Code Playgroud)

如果您需要更长的密码,只需使用子字符串跳过短划线:

string newPwd = Guid.NewGuid().ToString().Substring(0, 11);
newPwd = newPwd.Substring(0, 8) + newPwd.Substring(9, 2); // to skip the dash.
Run Code Online (Sandbox Code Playgroud)

如果你想确保第一个字符是alpha,你可以在需要时用固定字符串替换if(newPwd [0]> ='0'&& newPwd [0] <='9')...

我希望有人能发现这有用.:-)

  • 这不是一个好主意.首先,你将可能的字符集减少到16(而不是36); 另一方面,guids不一定是随机的,并且根据用于生成guid的方法,您创建的密码可能很容易预测.我强烈推荐Eric Lippert关于guids如何工作的系列文章,以获取更多信息:http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx (5认同)

Sol*_*lyM 15

我意识到可能有办法做到这一点.GUID方法很棒,除了它不混合UPPER和小写字母.在我的情况下,它只生成小写.

所以我决定使用正则表达式删除非alphas然后将结果子串到我需要的长度.

string newPassword = Membership.GeneratePassword(50, 0); 

newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => ""); 

newPassword = newPassword.Substring(0, 10);
Run Code Online (Sandbox Code Playgroud)

  • 虽然不太可能,但生成的初始密码可能包含少于10个字母数字字符,这将导致Subtring()方法抛出ArgumentOutOfRangeException(). (2认同)
  • @SollyM是的.然而,没有什么可以阻止所有50个字符作为符号(即不是字母数字).这不太可能,但可行.如果符号超过40个,那么第三行中的`Substring()`方法会抛出异常. (2认同)