PRB: Las solicitudes de autenticación de formularios no se dirigen a loginUrl página

Síntomas

Cuando se utiliza autenticación de formularios, las solicitudes no se redirigen a la página que se especifica en el atributo loginUrl .

Causa

Este problema se produce cuando más de una aplicación en un servidor utiliza la autenticación de formularios y estos valores de configuración son idénticos:

  • Nombres de las cookies
  • Rutas de cookies
  • Claves

Nombres de Cookie idénticos

Autenticación por formularios funciona principalmente fuera de la cookie de autenticación. Una cookie de autenticación se coloca en la colección HttpResponse.Cookies una vez que un usuario se autentica. Cuando llega una solicitud, la autenticación de formularios recupera la cookie de autenticación de la colección HttpRequest.Cookies .

Si una cookie válida no está presente, se redirige al usuario a la página que se especifica en el atributo loginUrl . Si una cookie válida está presente, la autenticación de formularios considera que el usuario autenticado.

El atributo name del elemento < forms > en los archivos .config determina el nombre de la cookie de autenticación. De forma predeterminada, es el nombre de la cookie. ASPXAUTH. Por lo tanto, si varias aplicaciones en el mismo servidor Web utilizan el nombre "authCookie" para la cookie de autenticación, una solicitud que se ha autenticado en una aplicación se considera autenticado en otra aplicación, porque la solicitud contiene una cookie denominada authCookie.

Rutas de Cookie idénticos

Autenticación por formularios funciona principalmente fuera de la cookie de autenticación. El atributo de ruta de acceso del elemento < forms > determina qué aplicación puede enviar a la cookie de autenticación en el servidor Web. El valor predeterminado del atributo de ruta de acceso es una barra diagonal (/) para que la cookie puede enviarse a cada aplicación en el sitio Web.

Por lo tanto, si varias aplicaciones en el mismo sitio Web utilizan la barra diagonal de la ruta de acceso de la cookie de autenticación, cuando se envía una solicitud de una aplicación a otra aplicación, la cookie de autenticación se envía a la otra aplicación.

Claves idénticas

El elemento < machineKey > controla el cifrado, el descifrado y la validación de la cookie de autenticación. La configuración predeterminada para el elemento es el siguiente:

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
Si varias aplicaciones utilizan valores idénticos, explícitos para el elemento < machineKey > , se descifra correctamente una cookie de autenticación que se envía desde una aplicación por otra aplicación.

Solución

Para resolver este problema, asegúrese de que al menos uno de los valores de tres configuración (nombre de la cookie, ruta de cookies y clave) es diferente para cada aplicación que utilice la autenticación de formularios.

Nombres de Cookie diferente

Si utiliza nombres de cookie diferente para cada aplicación, asegúrese de que la autenticación de formularios sólo recupera una cookie según el nombre que está configurado para esa aplicación.

Por ejemplo:

  1. Application1 utiliza el authCookie1 nombre.
  2. Application2 utiliza el authCookie2 nombre.
  3. Se realiza una solicitud para Application2.
  4. Autenticación mediante formularios intenta recuperar authCookie2 de la colección HttpRequest.Cookies , incluso si existe la cookie authCookie1.

    Cuando la autenticación de formularios no encuentra una cookie de autenticación con el nombre de authCookie2, el usuario se redirige a la página que se especifica en el atributo loginUrl para Application2.

Rutas de Cookie diferente

Si utiliza una ruta de cookie diferente, asegúrese de que la cookie de autenticación sólo se envía a la aplicación en la que se originó la cookie.

Por ejemplo:

  1. Application1 utiliza la/ruta Aplicación1.
  2. Application2 utiliza la ruta de acceso /application2.
  3. Autenticación de formularios se autentica en Application1.
  4. Se realiza una solicitud para Application2. El explorador no envía la cookie de autenticación de Application1 a Application2 porque la cookie puede enviarse sólo a Application1.
NOTA: el atributo de ruta de acceso distingue mayúsculas de minúsculas. Por lo tanto, si se establece el valor del atributo de ruta de acceso en/Aplicación1, y el nombre de la aplicación es Application1, la ruta de cookie de autenticación es/Aplicación1.

Cuando el usuario se autentica y redirige, el explorador no envía la cookie con la ruta de acceso/Aplicación1 a la aplicación Application1. Básicamente, la cookie de autenticación no es parte de la colección HttpRequest.Cookies . Como resultado, el usuario se redirige a la página que se especifica en el atributo loginUrl , incluso después de la autenticación.

Microsoft recomienda que limitar las cookies de autenticación de formularios a áreas del sitio que están protegidas mediante cifrado de Secure Sockets Layer (SSL).

Claves diferentes

Si diferentes aplicaciones utilizan valores diferentes explícitos para el elemento < machineKey > , el cifrado, el descifrado, o se produce un error en la validación de la cookie de autenticación. Como resultado, el usuario se redirige a la página que se especifica en el atributo loginUrl para la aplicación.

NOTA: incluso en configuraciones idénticas, siguen las reglas de autorización. En los ejemplos siguientes, si usuario1 se autentica en Application1 y realiza que una solicitud para Application2, la solicitud se autentica. Sin embargo, dado que Usuario1 no es uno de los usuarios permitidos en la sección < authorization >, la solicitud no está autorizada y se deniega.

Web.config en Application1
<configuration>   <system.web>
<authorization>
<allow users="User1,User2,User3" />
<deny users="?" />
</authorization>
</system.web>
</configuration>

Web.config en Application2
<configuration>   <system.web>
<authorization>
<allow users="User4,User5,User6" />
<deny users="?" />
</authorization>
</system.web>
</configuration>

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Configurar dos aplicaciones ASP.NET denominadas Application1 y Application2 para utilizar la autenticación de formularios con las siguientes configuraciones:

  1. Como el archivo Web.config para ambas aplicaciones, agregue el código siguiente:
    <?xml version="1.0" encoding="utf-8" ?><configuration>

    <system.web>

    <authentication mode="Forms">
    <forms loginUrl="login.aspx" name="formsauth1" timeout="60" path="/" >
    <credentials passwordFormat="Clear">
    <user name="username" password="password"/>
    </credentials>
    </forms>
    </authentication>

    <authorization>
    <deny users="?" />
    <allow users="*" />
    </authorization>

    </system.web>

    </configuration>

  2. Como el archivo Login.aspx para ambas aplicaciones, agregue el código siguiente:
    <%@ Page language="vb" AutoEventWireup="true" %>
    <form runat=server ID="Form1">
    <asp:Label runat="server" label="lblUserid" Text="UserID:" />
    <asp:TextBox id="txtUsername" runat=server Text="username" /><br>
    <asp:Label runat="server" label="lblPassword" Text="Password:" />
    <asp:TextBox id="txtPassword" runat=server Text="password" /><br>
    <asp:button text="Login" OnClick="Login_Click" runat=server ID="btnLogin"/><br>
    <asp:Label runat="server" id="lblStatus" />
    </form>

    <script runat=server>
    sub Login_Click(sender as Object , e as EventArgs )
    if(FormsAuthentication.Authenticate(txtUsername.Text, txtPassword.Text)) then
    FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, false)
    else
    lblStatus.Text = "Not Authenticated"
    end if
    end sub
    </script>

  3. Agregue el código siguiente como el archivo Default.aspx para Application1:
    <%@ Page AutoEventWireup="true" %>
    <asp:Label id=label1 runat="server" Text="Authenticated In Application1"></asp:Label><br>
    <asp:Label Runat=server ID="Label2" ></asp:Label>
    </Form>

  4. Agregue el código siguiente como el archivo Default.aspx para Application2:
    <%@ Page AutoEventWireup="true" %>
    <asp:Label id=label1 runat="server" Text="Authenticated In Application2"></asp:Label><br>
    <asp:Label Runat=server ID="Label2" ></asp:Label>
    </Form>

  5. Solicitar Default.aspx en Application1.
  6. Después se le redirige a Login.aspx, iniciar sesión, escriba el nombre de usuario para el nombre de usuario y contraseña para la contraseña. Observe que se le redirige a Default.aspx en Application1.
  7. Solicitar Default.aspx en Application2. Observe que no se le redirige a la página Login.aspx en Application2.

Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:

308157 CÓMO: implementar la autenticación basada en formularios en su aplicación ASP.NET utilizando Visual Basic .NET
306590 INFO: Introducción a la seguridad ASP.NET
313091 CÓMO: crear claves utilizando Visual Basic .NET for Use in Forms Authentication
Propiedades

Id. de artículo: 313116 - Última revisión: 9 ene. 2017 - Revisión: 1

Comentarios