Generando una URL única * y * aleatoria en C #

Mi objetivo final es crear una URL que sea única y no pueda ser adivinada / predicha. El propósito de esta URL es permitir a los usuarios realizar operaciones como verificar su dirección de correo electrónico y restablecer su contraseña. Estas URL expirarán dentro de un período de tiempo establecido (actualmente establecido en 24 horas).

Originalmente estaba usando unGuid para este propósito, pero ahora entiendo que esto está en algún lugar entre "muy bien" y "muy inseguro", dependiendo de qué experto escuches. Entonces, pensé que podría reforzar mi código un poco, por si acaso. Al principio pensé que me quedaría con el uso de unGuid, pero generarlo a partir de bytes aleatorios en lugar de laGuid.NewGuid() método de la fábrica. Aquí está el método que se me ocurrió:

public static Guid GetRandomGuid()
{
    var bytes = new byte[16];
    var generator = new RNGCryptoServiceProvider();
    generator.GetBytes(bytes);
    return new Guid(bytes);
}

No tengo muy claro qué sucede exactamente cuando usasnew Guid(bytes) en lugar deGuid.NewGuid(), pero creo que todo lo que hace este método es generar una matriz de bytes aleatoria yalmacenar en unGuid estructura de datos. En otras palabras, ya no se garantiza que sea único, solo se garantiza que sea aleatorio.

Dado que mis URL deben ser a la vez únicasy Al azar, esto no parece ser una solución sólida. Ahora estoy pensando, debería basar mis URL en una combinación de ambas, una ID única (que podría ser unaGuid o, si está disponible, una base de datos de identificación automática) y una secuencia aleatoria generada a partir deRNGCryptoServiceProvider.

Preguntas

¿Cuál es la mejor manera de generar una URL de verificación / restablecimiento de contraseña que sea a la vez única y extremadamente difícil / imposible de predecir / adivinar?

¿Debería simplemente construir mi URL concatenando una cadena única con una cadena aleatoria?

¿Tiene .NET Framework una forma integrada de generar fácilmente un únicoy ¿secuencia aleatoria (impredecible) que se puede usar para las URL?

Si no, ¿hay una buena solución de código abierto disponible?

Actualizar

En caso de que alguien tenga un requisito similar, actualmente estoy usando el siguiente método:

public static string GenerateUniqueRandomToken(int uniqueId)
    // generates a unique, random, and alphanumeric token
{
    const string availableChars =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    using (var generator = new RNGCryptoServiceProvider())
    {
        var bytes = new byte[16];
        generator.GetBytes(bytes);
        var chars = bytes
            .Select(b => availableChars[b % availableChars.Length]);
        var token = new string(chars.ToArray());
        return uniqueId + token;
    }
}

Por favor comenta si ves algún problema con esto.

Respuestas a la pregunta(5)

Su respuesta a la pregunta