2010-04-09 2 views
1

Après avoir inséré la configuration ci-dessous dans mon web.configComment rendre l'authentification ASP.NET persistante le fragment d'URL lors de la redirection vers la page de connexion?

<authentication mode="Forms"> 
    <forms name="appNameAuth" 
    path="/" loginUrl="login.aspx" protection="All" timeout="30"> 
    <credentials passwordFormat="Clear"> 
     <user name="user" password="password" /> 
    </credentials> 
    </forms> 
</authentication> 
<authorization> 
    <deny users="?" /> 
</authorization> 

Toutes les demandes de

Menu.aspx#fragment 

sont redirigés vers

login.aspx?ReturnUrl=/Menu.aspx 

et je pensais que ce serait redirigé vers

login.aspx?ReturnUrl=/Menu.aspx#fragment 

Comment atteindre le comportement souhaité?

+1

Vous devrez encoder # (% 23). Je ne suis pas sûr de la meilleure option pour le faire. Peut-être que vous pouvez le réparer avec une règle de réécriture? –

+0

@Claudio Je suppose que la réécriture est la seule option –

+0

En fait (désolé pour la confusion) ne pense pas que vous serez en mesure de le résoudre avec une règle de réécriture. Le problème ici est que les "ancres en ligne" (#fragment) sont gérés côté client, cette partie de l'URL ne va pas au serveur. Lorsque la logique du serveur détecte que vous n'êtes pas autorisé à accéder à «Menu.aspx», il redirige vers la page de connexion, perdant l'ancre en ligne. Je vous ferai savoir si j'ai trouvé une solution. –

Répondre

1

La seule solution que j'ai trouvée jusqu'ici est d'utiliser une règle de réécriture pour coder le caractère # à %23.

Merci Claudio!

+0

Pouvez-vous donner un peu plus de détails sur la façon dont vous avez fait cela? – MCS

+0

@MCS J'ai utilisé un String.Replace dans le fichier 'login.aspx.cs' –

4

Cette balise d'ancrage #fragment est un composant côté client (navigateur) de l'URL. Il n'est pas envoyé au WebServer autant que je sache, donc le côté serveur n'a aucune idée à ce sujet dans le cadre de la redirection.

EDIT

Pouvez-vous vérifier vos journaux IIS et vérifiez que parce que je suis sûr à 99% que ce n'est pas le cas.

À partir d'un test rapide sur ma machine locale.

  1. tentez de consulter

    http://localhost/formstest/private.aspx#test

  2. redirigés

    http://localhost/formstest/login.aspx?redirect=http%3a%2f%2flocahost%2fformstest%2fprivate.aspx#test

    (Notez le # est pas échappé dans le cadre de l'URL de redirection.

  3. Vérifiez IIS pour le premier hit.

    2010-04-12 13:36:45 W3SVCxxx 127.0.0.1 GET /formstest/private.aspx 80 - DÉTAILS Snipped - 302 0 0

    (Notez le 302 Redirect et l'absense du jeton sur #test l'URL

  4. Vérifiez IIS pour le coup redirect.

    2010-04-12 13:36:46 W3SVCxxx 127.0.0.1 GET /formstest/login.aspx redirect = http% 3a% 2f% 2flocahost% 2fformstest % 2fprivate.aspx 80 - DÉTAILS SNIPPED - 200 0

    (Il y a 200 votre réponse HTTP OK et toujours pas #test

Comme je l'ai dit, le serveur ne sait rien au sujet de la #ancre. C'est seulement du côté des clients, que vous l'ayez mis avant ou après la demande, ou que vous l'ayez mis à jour avec JQuery ... il ne va pas au serveur.

+1

Je suis désolé, vous auriez raison si ce #fragment a été changé après la demande de la page, mais dans mon cas, le #fragment est envoyé au serveur. –

+0

pourquoi le vote vers le bas? J'ai ajouté plus de détails expliquant que l'ancre ne fait PAS partie de la demande ... jamais. lisez-le ou essayez de le recréer vous-même et vérifiez les journaux IIS. http://www.mikeduncan.com/named-anchors-are-not-sent/ –

+0

@Eoin Vous m'avez montré les logs, mais les logs sont incomplets, mais quand je gère la requête dans le fichier 'aspx.cs' J'ai accès au hash via 'Request.Url.Fragment'. Une telle propriété n'existerait pas si ces informations n'atteignaient jamais le serveur. –

Questions connexes