Как использовать сгенерированную строку RNGCryptoServiceProvider в строке URL / запроса
ПРИМЕЧАНИЕ: я уже решил проблему, упомянутую в этом посте. После долгих поисков Google я не смог найти правильного решения. Как теперь я знаю ответ. Я думал, что этот пост сэкономит время других разработчиков, пытаясь решить то же самое.
Проблема:
Я хотел создать случайную криптографическую строку и отправить ее как часть URL пользователю. Со строкой Base64 вы, скорее всего, получите ошибку:
Модуль фильтрации запросов настроен на отклонение запроса, который содержит двойную escape-последовательность
или он не найдет ваш маршрут.
Поэтому вы можете взломать / обойти и найти / заменить escape-символы на Base64 String или использовать это решение.
Вот так выглядит мой оригинальный код.
public string GenerateRandomString()
{
var randomBytes = GenerateRandomBytes(512);
var randomString = Convert.ToBase64String(randomBytes);
return randomString;
}
private byte[] GenerateRandomBytes(int keyBitLength)
{
using (var provider = new RNGCryptoServiceProvider())
{
var lengthInByte = keyBitLength / 8;
var randomNumber = new byte[lengthInByte];
provider.GetBytes(randomNumber);
return randomNumber;
}
}
Решением является UrlTokenEncode. Добавлен новый метод для преобразования случайных байтов в Url Encoded Token.
public string GenerateRandomStringToken()
{
var randomBytes = GenerateRandomBytes(512);
return HttpServerUtility.UrlTokenEncode(randomBytes);
}
private byte[] GenerateRandomBytes(int keyBitLength)
{
using (var provider = new RNGCryptoServiceProvider())
{
var lengthInByte = keyBitLength / 8;
var randomNumber = new byte[lengthInByte];
provider.GetBytes(randomNumber);
return randomNumber;
}
}