Utilizzo del routing senza MVC: modulo di autenticazione
-
03-07-2019 - |
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 - 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.
Soluzione
Questi passaggi dovrebbero consentire di implementare il comportamento richiesto.
Riassumendo:
- 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 .
- 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