Question

Maintenant, j'essaie de travailler avec System.Web.Routing. Tout va bien, mais je ne comprends pas comment faire en sorte que l'authentification par formulaire fonctionne avec le routage d'URL (URL de renvoi, redirection, etc.). Google ne dit rien. Aidez-moi! :)

UPD: , j'ai oublié. je n'utilise pas MVC . C'est le problème. Comment utiliser l'authentification par formulaire et rounig sans MVC

UPD2: plus d'informations sur mon problème
Ce que je veux obtenir: URL telles & # 8220; mysite.com/content/123 & # 8221 ;, & # 8220; mysite.com/login / & # 8221 ;, etc en utilisant Routes. Il est important de faire en sorte que la page de connexion fonctionne comme suit: & # 8220; Normal & # 8221; Formulaire de connexion ASP.NET (redirige pour vous connecter depuis une zone sécurisée lorsque vous ne vous connectez pas et redirige vers une zone sécurisée lorsque vous êtes connecté).
C'est ce que je fais.
Dans global.asax sur Application_Start , enregistrez les itinéraires comme suit:

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

CustomRouteHandler et ContentRoute & # 8211; classes IRouteHandler simples, similaires à: ...

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

...

Tout semble parfait: je reçois content.aspx lorsque vous accédez à & # 8220; / content / 10 & # 8221; et . login.aspx à l’aide de & # 8220; / login / & # 8221; . Mais & # 8230;
Lorsque le contenu est sécurisé (dans web.config , avec deny = & # 8221;? & # 8221; ), le formulaire de connexion ne fonctionne pas comme prévu.
Je ne parviens plus à accéder à la page & # 8220; / content / 10 & # 8221; :

0. Je sais maintenant & # 8220; / content / 10 & # 8221; dans mon navigateur.
1. le site redirige vers & # 8220; / login /? ReturnUrl =% 2fcontent% 2f10 & # 8221; . (Hm semble que tous les problèmes commencent ici, non? :)
2. J'essaie de me connecter. Quels que soient les informations d'identification que j'ai saisies, je suis entré & # 8230;
3. & # 8230; site me redirige vers & # 8220; login? ReturnUrl =% 2fContent% 2f10 & # 8221; (écran jaune d'erreur - L'accès est refusé. Description: Une erreur s'est produite lors de l'accès aux ressources requises pour répondre à cette requête. Le serveur n'est peut-être pas configuré pour accéder à l'URL demandée .

Le problème est donc de savoir comment ASP.NET peut comprendre le vrai ReturnUrl et fournir une redirection après la connexion.

Était-ce utile?

La solution

Ces étapes devraient vous permettre d'implémenter le comportement requis.
Pour résumer:

  1. Vous utilisez le routage mais pas MVC. Mon exemple mappera une URL du type http: // hôte / Mysite / userid / 12345 sur une page réelle. sur http: //hôte/Mysite/Pages/users.aspx? userid = 12345 .
  2. Vous souhaitez contrôler l'accès à ces adresses et obliger l'utilisateur à se connecter. Mon exemple comporte une page http: //host/Mysite/login.aspx avec un contrôle de connexion standard, et le site est configuré pour utiliser l'authentification par formulaires.

Étape 1

J'ai "caché". le contenu du dossier Pages utilisant ce web.config dans le dossier 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>  

Cela garantit que si quelqu'un utilise une URL telle que http: // hôte / Mysite / Pages / users.aspx? Userid = 12345 , ils reçoivent alors une réponse 404 standard.

Étape 2

Mon fichier web.config de niveau supérieur contient (ainsi que tous les éléments standard) cet élément d'emplacement:

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

Ceci empêche l'accès anonyme aux URL du formulaire http: // host / Mysite / userid / 12345 ce qui signifie que les utilisateurs seront automatiquement redirigés vers login.aspx, puis s’ils fournissent des informations d’identité valides, ils seront redirigés vers le bon emplacement.

Étape 3

Pour référence, voici mon 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>

Et voici mon gestionnaire d'itinéraire:

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

Autres conseils

Le premier résultat d’une recherche sur Google est Frederiks, excellent article sur l'authentification par formulaires dans ASP.NET MVC . Notez que l'article était pertinent pour une version antérieure d'ASP.NET MVC. Vous devrez écrire et tester le code.

HTH, Indy

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top