Como dice el título, obtengo:
Longitud no válida para una matriz de caracteres Base-64.
He leído sobre este problema aquí y parece que la sugerencia es almacenar ViewState en SQL si es grande. Estoy usando un asistente con una gran cantidad de recopilación de datos, por lo que es probable que mi ViewState sea grande. Pero, antes de pasar a la solución "almacenar en base de datos", ¿quizás alguien pueda echar un vistazo y decirme si tengo otras opciones?
Construyo el correo electrónico para la entrega utilizando el siguiente método:
public void SendEmailAddressVerificationEmail(string userName, string to)
{
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=" +
userName.Encrypt("verify") + "\">" +
_configuration.RootURL + "Accounts/VerifyEmail.aspx?a=" +
userName.Encrypt("verify") + "</a>";
SendEmail(to, "", "", "Account created! Email verification required.", msg);
}
El método Encrypt se ve así:
public static string Encrypt(string clearText, string Password)
{
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));
return Convert.ToBase64String(encryptedData);
}
Así es como se ve el HTML en hotmail:
Haga clic en el enlace a continuación o péguelo en un navegador para verificar su cuenta de correo electrónico.
En el extremo receptor, la página VerifyEmail.aspx.cs tiene la línea:
string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");
Aquí está el captador de UserNameToVerify:
public string UserNameToVerify
{
get
{
return GetQueryStringValue("a").ToString();
}
}
Y aquí está el método GetQueryStringValue:
private static string GetQueryStringValue(string key)
{
return HttpContext.Current.Request.QueryString.Get(key);
}
Y el método de descifrado se ve así:
public static string Decrypt(string cipherText, string password)
{
**// THE ERROR IS THROWN HERE!!**
byte[] cipherBytes = Convert.FromBase64String(cipherText);
¿Se puede solucionar este error con una corrección de código o debo almacenar ViewState en la base de datos?