2010-04-12 39 views
32

Tôi làm cách nào để sử dụng Membership.GeneratePassword để trả lại mật khẩu CHỈ chứa các ký tự chữ hoặc số? Phương thức mặc định sẽ chỉ đảm bảo tối thiểu và không phải là số lượng tối đa các mật khẩu không phải là chữ và số.Thành viên Tạo mật khẩu chỉ có mật khẩu chữ và số?

+0

Tại sao bạn muốn thực hiện việc này? Các ký tự đặc biệt là một điều tốt để có trong mật khẩu của bạn. Nếu (đối với một số lý do kỳ lạ ngoài hiểu của tôi) bạn thực sự muốn một, viết phương pháp của riêng bạn để tạo ra nó và không sử dụng GeneratePassword. –

+20

Một lý do là vì những mật khẩu được tạo ra đó không thực sự thân thiện với toàn cầu hóa. Một lý do khác là Giám đốc điều hành sử dụng ứng dụng này đã nổi giận với mật khẩu xấu xí nhưng chưa được bảo mật và yêu cầu bạn thay đổi mật khẩu đó. – Greg

+0

Hoặc trong trường hợp của tôi, các dấu chấm câu đang gây ra lỗi máy chủ trong API mà tôi đang gọi. – Drew

Trả lời

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

biểu thức chính quy này sẽ thay thế tất cả các ký tự không phải chữ và số với nhân vật số 9.

+0

Điều này sẽ mất khá nhiều ngẫu nhiên trong mật khẩu của bạn. Không được khuyến khích. –

+11

@Matti Có thể thay thế "9" bằng số nguyên Random.Next (0, 9). Việc đặt các ký tự không phải chữ và số vào mật khẩu điển hình thường quá mức cần thiết. Mật khẩu được tạo ngẫu nhiên không sử dụng các từ là tốt cho nhiều ứng dụng. Lý do để làm điều này là khả năng sử dụng. Nhiều ký tự không phải chữ và số có thể dễ dàng bị nhầm lẫn hoặc nhầm lẫn hoặc không thể được người dùng trung bình nhập vào. –

+0

@Matti Cũng có thể với mã này sau đó quay lại và chỉ chèn một tập hợp con các ký tự không phải chữ và số được chấp thuận. Tôi không thấy cần cho bất kỳ ứng dụng nào. –

13

Một cách đơn giản để có được một 8 ký tự mật khẩu chữ và số sẽ được tạo ra một guid và sử dụng làm cơ sở:

string newPwd = Guid.NewGuid().ToString().Substring(0, 8); 

Nếu bạn cần một mật khẩu dài hơn, chỉ cần bỏ qua các dấu gạch ngang bằng chuỗi con:

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

Nếu bạn muốn đảm bảo ký tự đầu tiên là alpha, bạn chỉ có thể thay thế nó khi cần bằng chuỗi cố định nếu (newPwd [0]> = '0' & & newPwd [0] < = '9') .. .

Tôi hy vọng ai đó có thể thấy điều này hữu ích. :-)

+4

Đây không phải là một ý tưởng tốt. Đối với một, bạn đang giảm tập hợp các ký tự có thể thành 16 (thay vì 36); khác, guids không nhất thiết phải ngẫu nhiên, và tùy thuộc vào phương pháp sử dụng để tạo ra các guid các mật khẩu mà bạn đang tạo ra có thể dễ dàng dự đoán được. Tôi đánh giá cao loạt bài viết của Eric Lippert về cách thức hoạt động của guids để biết thêm thông tin về điều này: http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx –

0

Tôi cũng thích phương pháp GUID - đây là phiên bản ngắn:

string password = Guid.NewGuid().ToString("N").Substring(0, 8); 
+4

Hiệu quả câu trả lời chính xác giống như của Laura, với định dạng chuỗi được chỉ định không có lý do gì (có hiệu lực bằng không). –

10

tôi nhận ra rằng có thể có nhiều cách để làm điều này. Phương pháp GUID là tuyệt vời, ngoại trừ nó không trộn UPPER và bảng chữ cái chữ thường. Trong trường hợp của tôi nó chỉ tạo ra trường hợp thấp hơn.

Vì vậy, tôi quyết định sử dụng Regex để loại bỏ các ký tự không phải chữ cái, sau đó xâu chuỗi các kết quả theo độ dài mà tôi cần.

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

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

newPassword = newPassword.Substring(0, 10); 
+0

Cảm ơn tôi đã sử dụng nó trong dự án của tôi –

+2

Mặc dù không khả thi, mật khẩu ban đầu được tạo có thể chứa ít hơn 10 ký tự chữ và số, sau đó kết quả là ArgumentOutOfRangeException() được ném bởi phương thức Substring(). – Chris

+0

Tôi cầu xin @Chris khác nhau. 50 trong 'Membership.GeneratePassword' chỉ định chiều dài của mật khẩu, không chỉ là' MaxLength'. – SollyM

1

Bạn cũng có thể thử tạo mật khẩu và ghép các ký tự không phải chữ và số cho đến khi đạt đến độ dài mật khẩu mong muốn.

public string GeneratePassword(int length) 
{ 
    var sb = new StringBuilder(length); 

    while (sb.Length < length) 
    { 
     var tmp = System.Web.Security.Membership.GeneratePassword(length, 0); 

     foreach(var c in tmp) 
     { 
      if(char.IsLetterOrDigit(c)) 
      { 
       sb.Append(c); 

       if (sb.Length == length) 
       { 
        break; 
       } 
      } 
     } 
    } 

    return sb.ToString(); 
} 
0

Có cách tiếp cận tương tự với giải pháp của breigo. Có thể điều này không hiệu quả nhưng rõ ràng và ngắn gọn

string GeneratePassword(int length) 
{ 
    var password = ""; 
    while (password.Length < length) 
    { 
      password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit)); 
    } 
    return password; 
} 
Các vấn đề liên quan