request_uri http_host examples c# iis cookies url-rewriting

c# - http_host - Lectura del valor de la cookie: uso del módulo URL Rewrite Provider: no se puede validar en System.Web.Configuration.MachineKeySection.EncryptOrDecryptData



url rewrite iis install iis 8 (1)

Tengo el requisito de agregar USERNAME a la URL en el lado del servidor usando el módulo URL Rewrite.

¿Por qué? : Tengo el sitio web sitio1 , cuando el USUARIO inicia sesión en el sitio1, verá un enlace al sitio2. , Este enlace es URL o informes. (Cuadro). El boleto autenticado se ha creado usando FormAuthentication en el sitio1 . Cuando el USUARIO hace clic en el enlace, el nombre de usuario autenticado debe pasarse al sitio2.

Podría agregar un nombre de usuario desde el lado del cliente, pero debido a problemas de seguridad tengo que agregar el nombre de usuario a la URL en el lado del servidor antes de que se ejecute.

Así que decidí usar el proveedor de reescritura de URL, que toma el nombre de usuario descifrando el valor de la cookie como se muestra a continuación

namespace PlatformAnalysisUrlProvider.PlatformAnalysisProvider { class AnalysisRewriteProvider: IRewriteProvider, IProviderDescriptor { public void Initialize(IDictionary<string, string> settings, IRewriteContext rewriteContext) { } public string Rewrite(string value) { string[] cookievalues = value.Spli(''=''); FormAuthentication ticket = FormAuthentication.Decrypt(cookievalues[1]); //Decrypt throws error as shown below } } }

Valores de cookies

cookievalues [0] = has the key cookievalues [1] = has the value

Ejemplo:

233AWJDKSHFHFDSHFJKDFDKJFHDKJFKDJFHDHFDHFKJHDFKJHDFJHDKJFHDSKJFHDF

Es un valor de cookie. Pero descifrar no está sucediendo

Me aparece el siguiente error

Unable to validate data. at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData( Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo, Boolean signData)

Aquí está mi configuración en IIS para reescribir URL

  • URL solicitada: coincide con los patrones
  • Uso: expresión regular
  • Ignorar caso - Marcado
  • Condiciones: entrada: {HTTP_COOKIE} Tipo: coincide con el patrón de patrón:. *
  • Tipo de acción: reescribir
  • Reescribir URL: http://11.155.011.123 {HTTP_URL} & USERNAME = {PlatformAnalysisUrlProvider: {C: 0}}

También configuré MACHINE KEY como lo sugiere este foro

He referido esta publicación para desarrollo

Una de las publicaciones de desbordamiento de pila sugirió que podría tratarse de un problema de firewall o antivirus. Pero no tengo antivirus instalado o firwall habilitado.

Realmente ayuda si alguien me dirige a una muestra de código donde se usa el sitio web alojado en IIS y el proveedor de reescritura de URL.

Actualización del registro de errores

Notificación MODULE_SET_RESPONSE_ERROR_STATUS - "PRE_BEGIN_REQUEST" HttpReason - "Error de módulo de reescritura de URL"

Actualización de la publicación con información clave de la máquina

<MachineKey Description="AES" validation="SHA1" descriptionKey="******" validationKey="******" CompatibilityMode="Framework20SP2">

La razón puede ser : el sitio web donde se crean las cookies se desarrolla utilizando .NET Framework 4.5. El proveedor donde leemos la cookie es Framework 3.5. ¿Es esta la causa? O ¿Necesitamos un archivo de configuración para el proyecto del proveedor?

Actualizaciones : agregué la clave de máquina a Machine.config, pero aún no funcionó :(

Solución alternativa

  • Agregue App.config a la biblioteca de clases

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!-- ... --> <add key="SecurityKey" value="somevalue"/> <!-- ... --> </appSettings> </configuration>

  • Copie la configuración a GAC ​​Siga este blog: http://techphile.blogspot.in/2007/02/2.html

  • Cifre el valor ( consulte aquí ) y cree una cookie personalizada durante el inicio de sesión

  • Use la lógica de descifrado dentro del proveedor de reescritura personalizado

Lo bueno de esto es que el error es un error de descifrado general y no uno con URL Rewrite en sí, por lo que le brinda un área más amplia para buscar ayuda. La mecánica de URL Rewrite parece ser correcta.

Descifrar significa que se debe cifrar por el mismo método que se descifró. Por lo tanto, tiene que ser la cookie correcta y el método de descifrado correcto.

Como no está comprobando qué cookie está leyendo, podría obtener resultados inesperados si la cookie incorrecta es la primera en la lista de cookies.

Estos son algunos pasos que recomiendo para solucionar este problema:

  • Cree una regla simple de reescritura de URL que le dará el valor de su cookie. Creé una regla para hacer eso en mi ejemplo a continuación. Puedes probarlo visitando yoursite.com/getcookie. Debería redirigirse a yoursite.com/?Cookie={cookievalue}
  • Luego puede probar su código fuera del proveedor de reescritura de URL. Puede crear una aplicación de consola simple o una aplicación winforms para probar el resto del código.
  • Recomiendo agregar un cheque por la existencia de la cookie y luego un cheque nuevamente por el segundo valor. Por ejemplo: if (cookievalues ​​[1]! = Null) .
  • Al desarrollar el método de descifrado, no tiene que preocuparse por la reescritura de URL. Siempre que funcione en una aplicación de prueba en .NET, entonces debería estar configurado.

<rule name="Get cookie value" stopProcessing="true"> <match url="^getcookie" /> <action type="Redirect" url="/?Cookie={HTTP_COOKIE}" appendQueryString="false" redirectType="Found" /> </rule>