asp.net - net - oauth2 c#



Utilizzo del routing senza MVC: modulo di autenticazione (2)

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

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

Passo 1

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

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

Questo assicura che se qualcuno usa un url come http: //host/Mysite/Pages/users.aspx? Userid = 12345 , riceve una risposta standard 404.

Passo 2

Il mio file web.config di livello superiore contiene (così come tutte le cose 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 formato http: // host / Mysite / userid / 12345, il che significa che gli utenti verranno automaticamente reindirizzati a login.aspx, quindi se forniscono credenziali valide, verranno reindirizzati nella posizione corretta.

Passaggio 3

Per riferimento qui è 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 di percorsi:

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

https://code.i-harness.com

Ora sto provando a lavorare con System.Web.Routing. Tutto va bene, ma non riesco a capire come far funzionare l'autenticazione della form con il routing dell'URL (return url, redirection, etc). Google non dice nulla. Aiuto! :)

UPD: Ho dimenticato - Non uso MVC . Questo è il problema. Come utilizzare l'autenticazione rounig e form senza MVC

UPD2: altro sul mio problema
Cosa voglio ottenere: urls come " mysite.com/content/123 ", " mysite.com/login/ ", ecc. Usando Routes. È importante che la pagina di accesso funzioni come un normale modulo di accesso ASP.NET (reindirizza per accedere da un'area protetta quando non si effettua l'accesso e reindirizzare nuovamente all'area protetta quando si effettua la registrazione).
È 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 - semplici classi IRouteHandler , proprio come: ...

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

...

Tutto sembra essere perfetto: sto ricevendo content.aspx quando vai a “/content/10” e login.aspx quando vai a “/login/” . Ma…
Quando web.config contenuti (in web.config , con deny=”?” ), Il modulo di accesso non funziona come previsto.
Ora non riesco a raggiungere la pagina “/content/10” :

0. Sto digitando “/content/10” nel mio browser.
1. Il reindirizzamento del sito a “/login/?ReturnUrl=%2fcontent%2f10” . (Hm ... sembra che tutti i problemi inizino qui, giusto? :)
2. Sto tentando di accedere. Indipendentemente dalle credenziali in cui sono inserito ...
3. ... il sito mi reindirizza a “login?ReturnUrl=%2fContent%2f10” (schermata gialla di errore - Access is denied. Descrizione: si An error occurred while accessing the resources required to serve this request. The server may not be configured for access to the requested URL .)
Quindi, il problema è come far ReturnUrl ASP.NET comprenda ReturnUrl reale e fornisca il reindirizzamento dopo il login.


Il primo risultato ottenuto da una ricerca su Google è l'eccellente post di Frederiks sull'autenticazione di moduli in ASP.NET MVC . Si noti che il post era rilevante per una versione precedente di ASP.NET MVC, sarà necessario scrivere e testare il codice.

HTH, Indy





routing