Solución:
La longitud de una cadena codificada en base64 es siempre un múltiplo de 4. Si no es un múltiplo de 4, entonces =
los caracteres se añaden hasta que lo sea. Una cadena de consulta del formulario ?name=value
tiene problemas cuando el value
contiene =
charaters (algunos de ellos se eliminarán, no recuerdo el comportamiento exacto). Es posible que pueda salirse con la suya agregando el número correcto de =
caracteres antes de realizar la decodificación base64.
Editar 1
Puede encontrar que el valor de UserNameToVerify
ha tenido "+"
ha cambiado a " "
es por lo que es posible que deba hacer algo como esto:
a = a.Replace(" ", "+");
Esto debería tener la longitud correcta;
int mod4 = a.Length % 4;
if (mod4 > 0 )
{
a += new string('=', 4 - mod4);
}
Por supuesto llamando UrlEncode
(como en la respuesta de LukeH) debería hacer que todo esto sea discutible.
Supongo que simplemente necesita codificar en URL su cadena Base64 cuando la incluye en la cadena de consulta.
La codificación Base64 utiliza algunos caracteres que deben codificarse si forman parte de una cadena de consulta (es decir +
y /
, y tal vez =
también). Si la cadena no está codificada correctamente, no podrá decodificarla correctamente en el otro extremo, de ahí los errores.
Puedes usar el HttpUtility.UrlEncode
método para codificar su cadena Base64:
string msg = "Please click on the link below or paste it into a browser "
+ "to verify your email account.<br /><br /><a href=""
+ _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
+ HttpUtility.UrlEncode(userName.Encrypt("verify")) + "">"
+ _configuration.RootURL + "Accounts/VerifyEmail.aspx?a="
+ HttpUtility.UrlEncode(userName.Encrypt("verify")) + "</a>";
No soy lo suficientemente reputado como para votar o comentar todavía, pero la respuesta de LukeH fue acertada para mí.
Como el cifrado AES es el estándar para usar ahora, produce una cadena base64 (al menos todas las implementaciones de cifrado / descifrado que he visto). Esta cadena tiene una longitud en múltiplos de 4 (string.length% 4 = 0)
Las cadenas que estaba obteniendo contenían + y = al principio o al final, y cuando las concatena en la cadena de consulta de una URL, se verá bien (por ejemplo, en un correo electrónico que genere), pero cuando se siga el enlace y el La página .NET lo recibe y lo coloca en this.Page.Request.QueryString, esos caracteres especiales desaparecerán y la longitud de la cadena no será múltiplo de 4.
Como hay caracteres especiales al FRENTE de la cadena (por ejemplo: +), así como = al final, no puede simplemente agregar algunos = para compensar la diferencia, ya que está alterando el texto cifrado de una manera que no lo hace. no coincide con lo que estaba realmente en la cadena de consulta original.
Por lo tanto, envolver el texto cifrado con HttpUtility.URLEncode (no HtmlEncode) transforma los caracteres no alfanuméricos de una manera que garantiza que .NET los vuelva a analizar en su estado original cuando se interprete en la colección de cadenas de consulta.
Lo bueno es que solo necesitamos hacer el código URLEncode al generar la cadena de consulta para la URL. En el lado entrante, se vuelve a traducir automáticamente al valor de cadena original.
Aquí hay un código de ejemplo
string cryptostring = MyAESEncrypt(MySecretString);
string URL = WebFunctions.ToAbsoluteUrl("~/ResetPassword.aspx?RPC=" + HttpUtility.UrlEncode(cryptostring));