如何在 url/query 字符串中使用 RNGCryptoServiceProvider 生成的字符串

How to use RNGCryptoServiceProvider generated string in url/query string

注意: 我已经解决了post中提到的问题。 在做了很多 google 之后,我找不到正确的解决方案。现在我知道答案了。我认为这 post 会节省其他开发人员尝试解决相同问题的时间。

问题:

我想生成加密随机字符串并将其作为 url 的一部分发送给用户。使用 Base64 字符串,您可能会得到 Error:

The request filtering module is configured to deny a request that contains a double escape sequence

否则它将找不到您的路线。

所以要么 hack/workaround 和 find/replace 对 Base64 字符串转义字符,要么使用此解决方案。

这是我的原始代码的样子。

  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 编码令牌的新方法。

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;
   }
}

上面的问题也提供了解决方案