Pregunta

Ahora estoy tratando de trabajar con System.Web.Routing. Todo está bien, pero no puedo entender cómo hacer que la autenticación de formularios funcione con enrutamiento de URL (retorno de URL, redirección, etc.). Google no dice nada. ¡Ayuda! :)

UPD: Olvidé, no uso MVC . Ese es el problema. Cómo utilizar la autenticación de formulario y formulario sin MVC

UPD2: más sobre mi problema
Lo que quiero obtener: URL como & # 8220; mysite.com/content/123 & # 8221 ;, & # 8220; mysite.com/login/ & # 8221 ;, etc. utilizando Rutas. Es importante que la página de inicio de sesión funcione como & # 8220; regular & # 8221; Formulario de inicio de sesión de ASP.NET (redirige al inicio de sesión desde el área segura cuando no se inicia sesión y redirige al área segura cuando se inicia la sesión). Eso es lo que estoy haciendo.
En global.asax en Application_Start , registre rutas como esta:

routes.Add("LoginPageRoute", new Route("login/", new CustomRouteHandler("~/login.aspx")));
routes.Add("ContentRoute", new Route("content/{id}", new ContentRoute("~/content.aspx"))
{
    Constraints = new RouteValueDictionary {{ "id", @"\d+" }}
});

Donde CustomRouteHandler y ContentRoute & # 8211; clases simples de IRouteHandler , como: ...

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
    return page;
}

...

Todo parece ser perfecto: estoy obteniendo content.aspx cuando voy a & # 8220; / content / 10 & # 8221; y login.aspx cuando vaya a & # 8220; / login / & # 8221; . Pero & # 8230;
Cuando hago contenido seguro (en web.config , con deny = & # 8221;? & # 8221; ), el formulario de inicio de sesión no funciona como se esperaba.
Ahora no puedo & # 8217; t llegar a la página & # 8220; / content / 10 & # 8221; :

0. I & # 8217; estoy escribiendo & # 8220; / content / 10 & # 8221; en mi navegador.
1. el sitio redirige a & # 8220; / login /? ReturnUrl =% 2fcontent% 2f10 & # 8221; . (Hm & # 8230; parece que todos los problemas comienzan aquí, ¿verdad? :)
2. Estoy intentando iniciar sesión. No importa qué credenciales ingresé & # 8230;
3. & # 8230; el sitio me redirige a & # 8220; ¿iniciar sesión? ReturnUrl =% 2fContent% 2f10 & # 8221; (pantalla amarilla del error - Acceso denegado. Descripción: Se produjo un error al acceder a los recursos necesarios para atender esta solicitud. Es posible que el servidor no esté configurado para acceder a la URL solicitada .)
Entonces, el problema es cómo lograr que ASP.NET entienda el ReturnUrl real y proporcione una redirección después del inicio de sesión.

¿Fue útil?

Solución

Estos pasos deberían permitirle implementar el comportamiento requerido.
Para resumir:

  1. Está utilizando enrutamiento pero no MVC. Mi ejemplo asignará un url como http: // host / Mysite / userid / 12345 en una página real en http: //host/Mysite/Pages/users.aspx? userid = 12345 .
  2. Desea controlar el acceso a estas direcciones, lo que requiere que el usuario inicie sesión. Mi ejemplo tiene una página http: //host/Mysite/login.aspx con un control de inicio de sesión estándar, y el sitio está configurado para usar formularios de autenticación.

Paso 1

He " oculto " el contenido de la carpeta Páginas usando este web.config en la carpeta Páginas:

  <?xml version="1.0"?>
  <configuration>
    <system.web>
      <httpHandlers>
        <add path="*" verb="*"
            type="System.Web.HttpNotFoundHandler"/>
      </httpHandlers>
      <pages validateRequest="false">
      </pages>
    </system.web>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <handlers>
        <remove name="BlockViewHandler"/>
        <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler"/>
      </handlers>
    </system.webServer>
  </configuration>  

Esto garantiza que, si alguien utiliza una URL como http: // host / Mysite / Pages / users.aspx? Userid = 12345 , luego reciben una respuesta 404 estándar.

Paso 2

Mi archivo web.config de nivel superior contiene (así como todas las cosas estándar) este elemento de ubicación:

  <location path="userid">
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
  </location>

Esto evita el acceso anónimo a las direcciones URL del formulario http: // host / Mysite / userid / 12345 lo que significa que los usuarios serán redirigidos automáticamente a login.aspx, y luego, si proporcionan credenciales válidas, serán redirigidos a la ubicación correcta.

Paso 3

Como referencia aquí está mi global.asax:

<script RunAt="server">

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RegisterRoutes(RouteTable.Routes);
     }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.RouteExistingFiles = true;
        routes.Add("UseridRoute", new Route
        (
           "userid/{userid}",
           new CustomRouteHandler("~/Pages/users.aspx")
        ));
    }

</script>

Y aquí está mi controlador de ruta:

using System.Web.Compilation;
using System.Web.UI;
using System.Web;
using System.Web.Routing;
using System.Security;
using System.Web.Security;


public interface IRoutablePage
{
    RequestContext RequestContext { set; }
}

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        var page = BuildManager.CreateInstanceFromVirtualPath
             (VirtualPath, typeof(Page)) as IHttpHandler;

        if (page != null)
        {
            var routablePage = page as IRoutablePage;

            if (routablePage != null) routablePage.RequestContext = requestContext;
        }

        return page;
    }
}

Otros consejos

El primer resultado que obtuve de una búsqueda en Google es la excelente publicación de Frederik en autenticación de formularios en ASP.NET MVC . Tenga en cuenta que la publicación era relevante para una versión anterior de ASP.NET MVC, tendrá que escribir y probar el código.

HTH, Indy

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top