Domanda

Ora sto cercando di lavorare con System.Web.Routing. Va tutto bene, ma non riesco a capire come far funzionare l'autenticazione con routing dell'URL (url di ritorno, reindirizzamento, ecc.). Google non dice nulla. Aiuto! :)

UPD: ho dimenticato - non utilizzo MVC . Questo è il problema. Come utilizzare rounig e l'autenticazione dei moduli senza MVC

UPD2: ulteriori informazioni sul mio problema
Quello che voglio ottenere: urls come & # 8220; mysite.com/content/123 & # 8221 ;, & # 8220; mysite.com/login/ & # 8221 ;, ecc. Utilizzando le route. È importante che la pagina di accesso funzioni come & # 8220; regular & # 8221; Modulo di accesso ASP.NET (reindirizza per accedere dall'area protetta quando non effettua l'accesso e reindirizza all'area protetta quando viene effettuato l'accesso).
Questo è quello che sto facendo.
In global.asax su Application_Start , registra percorsi come questo:

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+" }}
});

Dove CustomRouteHandler e ContentRoute & # 8211; semplici classi IRouteHandler , proprio come: ...

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

...

Tutto sembra perfetto: sto ricevendo content.aspx quando vado in & # 8220; / content / 10 & # 8221; e login.aspx quando vai su & # 8220; / login / & # 8221; . Ma & # 8230;
Quando rendo i contenuti protetti (in web.config , con deny = & # 8221;? & # 8221; ), il modulo di accesso non funziona come previsto.
Ora non riesco a raggiungere la pagina & # 8220; / content / 10 & # 8221; :

0. Sto digitando & # 8220; / content / 10 & # 8221; nel mio browser.
1. Il sito reindirizza a & # 8220; / login /? ReturnUrl =% 2fcontent% 2f10 & # 8221; . (Hm & # 8230; sembra che tutti i problemi inizino qui, giusto? :)
2. Sto tentando di accedere. Non importa quali credenziali ho immesso & # 8217; m
3. & # 8230; il sito mi reindirizza a & # 8220; login? ReturnUrl =% 2fContent% 2f10 & # 8221; (schermata gialla di errore - Accesso negato. Descrizione: Si è verificato un errore durante l'accesso alle risorse necessarie per soddisfare questa richiesta. Il server potrebbe non essere configurato per l'accesso all'URL richiesto .)
Quindi, il problema è come far capire ad ASP.NET il vero ReturnUrl e fornire il reindirizzamento dopo il login.

È stato utile?

Soluzione

Questi passaggi dovrebbero consentire di implementare il comportamento richiesto.
Riassumendo:

  1. Stai utilizzando il routing ma non MVC. Il mio esempio mapperà un URL come http: // host / Mysite / userid / 12345 su una pagina reale all'indirizzo http: //host/Mysite/Pages/users.aspx? userid = 12345 .
  2. Desideri controllare l'accesso a questi indirizzi, richiedendo all'utente l'accesso. Il mio esempio ha una pagina http: //host/Mysite/login.aspx con un controllo di accesso standard, e il sito è configurato per utilizzare l'autenticazione basata su moduli.

Passaggio 1

Ho " nascosto " il contenuto della cartella Pagine usando questo web.config nella cartella Pagine:

  <?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>  

Ciò garantisce che se qualcuno utilizza un URL come http: // host / Mysite / Pages / users.aspx? Userid = 12345 , quindi ricevono una risposta 404 standard.

Passaggio 2

Il mio file web.config di livello superiore contiene (oltre a tutto il materiale standard) questo elemento di posizione:

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

Ciò impedisce l'accesso anonimo agli URL del modulo http: // host / Mysite / userid / 12345 il che significa che gli utenti verranno reindirizzati automaticamente a login.aspx, quindi se forniscono credenziali valide, verranno reindirizzati nella posizione corretta.

Passaggio 3

Per riferimento ecco il mio 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>

Ed ecco il mio gestore del percorso:

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;
    }
}

Altri suggerimenti

Il primo risultato che ho ottenuto da una ricerca su Google è l'eccellente post di Frederiks su autenticazione dei moduli in ASP.NET MVC . Nota che il post era rilevante per una versione precedente di ASP.NET MVC, dovrai scrivere e testare il codice.

HTH, Indy

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top