2011-10-21 24 views
5

Tôi đang cố gắng tìm các url thân thiện. Url thân thiện tại thời điểm này đang có như thế này:Vượt qua id, nhưng không hiển thị nó trong url thực tế

localhost/khách hàng/1/namehere

Tôi muốn họ như thế này:

localhost/khách hàng/namehere

Nhưng vẫn muốn có id (vì tôi tìm kiếm cơ sở dữ liệu của tôi với id này). Khả năng của tôi là gì? Và điều này thậm chí có thể?

Đây là MapRoute tôi:

context.MapRoute(
      "Customer_Default", 
      "customer/{customername}/", 
      new { controller = "customer", action = "view", id = "", customername = "" } 
     ); 

Đây là cách để tôi liên kết:

@Html.ActionLink(c.Bedrijfsnaam, "view", "customer", new { id = c.Klantnummer, customername = UrlEncoder.ToFriendlyUrl(c.Bedrijfsnaam) }, null) 

Cảm ơn.

Cập nhật: Ồ, không sao nếu người dùng thay đổi. Tôi chỉ muốn nó không hiển thị. Vì vậy, người dùng có thể dễ dàng thay đổi url đến nơi họ muốn đi. Và không phải lo lắng về id. (Nhưng tôi vẫn cần nó. :))

+0

nếu tôi hiểu câu hỏi của bạn - với mẫu này 'localhost/customer/namehere', vấn đề duy nhất của bạn là chuyển 'ID'? nếu vậy tại sao không sử dụng biến phiên? –

Trả lời

2

Nếu tôi hiểu chính xác câu hỏi của bạn, id là id ứng dụng khách.

Nếu bạn không muốn hiển thị ID của mình, giải pháp là không sử dụng id số và thực hiện truy vấn trực tiếp theo tên khách hàng. Điều này thực sự chậm hơn một chút nhưng không quá chậm. Bạn có thể lấy id có truy vấn "đảo ngược" theo tên khách hàng, bạn có thể lập chỉ mục theo tên khách hàng.

Một khả năng để tránh quá nhiều truy vấn bằng tên người dùng là lưu trữ id trong phiên hoặc trong trường ẩn trong biểu mẫu sử dụng bài đăng (bạn có thể kết hợp http bài đăng và http mà không gặp quá nhiều sự cố). Bạn có thể lưu trữ hai trường: tên máy khách và id ứng dụng khách, nếu tên ứng dụng phù hợp với tên trong http get, bạn không cần tìm nạp id. Nếu chúng không khớp, bạn có thể truy vấn db cho id. Ý tưởng là để lưu trữ id, do đó bạn chỉ tìm kiếm id theo khách hàng một lần.

2

Bạn có thể ví dụ mã hóa số id + thêm một số hàm băm vào đó. Bằng cách này, người dùng không thể thay đổi nó đơn giản.

Hoặc bạn chỉ cần mã hóa số id của mình bằng mật mã đối xứng, như AES hoặc DES. Kết quả id sẽ dài hơn (vì chúng hoạt động trong các khối 64-256 bit) và sẽ không thể thay đổi ký tự ngẫu nhiên và nhận được id hợp lệ (về mặt kỹ thuật với đủ số người có thể làm được ... Chúc may mắn!)

một ví dụ mã

// Generate key. You do it once and save the key in the web.config or in the code 
var encryptorForGenerateKey = Aes.Create(); 
encryptorForGenerateKey.BlockSize = 128; 
encryptorForGenerateKey.KeySize = 128; 
encryptorForGenerateKey.GenerateKey(); 
encryptorForGenerateKey.GenerateIV(); 

var key = encryptorForGenerateKey.Key; 
var iv = encryptorForGenerateKey.IV; 

// Encrypt 

var encryptor = Aes.Create(); 
var encryptorTransformer = encryptorForGenerateKey.CreateEncryptor(key, iv); 

int id = 123; 
var bytes = BitConverter.GetBytes(id); 
var encrypted = encryptorTransformer.TransformFinalBlock(bytes, 0, bytes.Length); 
var encryptedString = BitConverter.ToString(encrypted); 

Console.WriteLine(encryptedString); 

// Decrypt 

var decryptor = Aes.Create(); 
var decryptorTransformer = decryptor.CreateDecryptor(key, iv); 

String[] arr = encryptedString.Split('-'); 
byte[] encrypted2 = new byte[arr.Length]; 
for (int i = 0; i < arr.Length; i++) 
{ 
    encrypted2[i] = Convert.ToByte(arr[i], 16); 
} 

// If the block is irregular there is the possibility TransformFinalBlock will throw 

var result = decryptorTransformer.TransformFinalBlock(encrypted2, 0, encrypted2.Length); 

if (result.Length != sizeof(int)) 
{ 
    throw new Exception(); 
} 

var id2 = BitConverter.ToInt32(result, 0); 

cho id = 123 chúng tôi đã một mã hóa id = 4E-CD-80-9E-7E-FB-A7-B9-74-B6-3A-37-57-9C-BD-A9. Tôi có thể làm cho nó ngắn hơn bằng cách sử dụng Base64 hoặc bằng cách xóa -, nhưng trong trường hợp thứ hai, mã sẽ khó hơn một chút. Nếu không có sự -: D2B4F51E6577967A2262E3AE51F3EC74, trong Base64: 0rT1HmV3lnoiYuOuUfPsdA==

Xét sử dụng của bạn, có lẽ DES là đủ an toàn. Với DES các id sẽ là:

F2-54-4B-CE-23-83-96-C2 // With - 
F2544BCE238396C2 // Without - 
8lRLziODlsI= // Base64 

Để sử dụng DES thay đổi tất cả các Aes để DES và loại bỏ các BlockSizeKeySize dòng.

+0

Ồ, không sao nếu người dùng thay đổi nó. Tôi chỉ muốn nó không hiển thị. Vì vậy, người dùng có thể dễ dàng thay đổi url đến nơi họ muốn đi. –

+0

@VincentvanderLinden Nếu muốn bảo vệ chỉ chống lại "thay đổi" thì bạn chỉ cần băm nó bằng cách sử dụng một số muối bí mật. Sau đó, liên kết của bạn sẽ là: 123XXXXXXXX trong đó X là băm. Sau đó, bạn có thể kiểm tra xem băm đã được tạo ra bởi bạn hay chưa. Nếu bạn thậm chí muốn bảo vệ nó khỏi "xem" (ví dụ bạn không muốn người dùng của bạn biết có bao nhiêu khách hàng có) thì bạn mã hóa + băm. Hoặc bạn có thể đơn giản mã hóa nó với (ví dụ) ECC (mã hóa đường cong elliptic). Sau đó, đầu ra sẽ khá dài và tìm ra "đúng" đầu ra "một cách ngẫu nhiên" sẽ là không thể. – xanatos

+0

@VincentvanderLinden giả sử liên kết của bạn là 'localhost/customer/namehere? Id = 1515870811'. Bạn có thể đoán id thực (không sử dụng một thuật toán ngu ngốc như vậy - nó được tạo ra với 1^0x5a5a5a5a) –

0

Nếu bạn muốn kết quả là xác định, bạn phải chuyển một số kết hợp thông số duy nhất. Trong trường hợp của bạn, bạn có thể sử dụng tham số "tên người dùng" với một số sau khi nó cho khách hàng có cùng tên (bạn sẽ phải lưu trữ số đó trong db của bạn cùng với tên khách hàng).Ví dụ:

localhost/customer/Aaron_Babichev - for the first customer with name Aaron Babichev 
localhost/customer/Aaron_Babichev_2 - for the second customer with name Aaron Babichev 
... 

Mặt nạ tuyến đường của bạn sẽ giống như customer/{customername}_{customerIndex}/.

Các vấn đề liên quan