2009-02-13 4 views
0

Voici le problème. J'utilise ASP.NET Forms Authentication pour un site Web de type solde de compte. Une fois qu'un utilisateur se connecte, il peut effectuer un paiement sur son compte en se rendant sur un site tiers (3pw). Lorsque l'utilisateur clique pour effectuer un paiement, voici ce qui se passe:L'intégration avec un site Web tiers provoque le problème d'authentification par formulaires

  1. Mon site Web fait une demande au 3pw en passant un identifiant.
  2. Le 3pw fait une demande à mon site en passant l'ID plus un ID de sécurité.
  3. Je vérifie des choses ....
  4. Plus de choses arrive que vous n'avez pas besoin de se soucier de ...

Quand je teste ce processus que je peux voir dans les journaux Web que je J'arrive à la page de paiement unique sur mon site. En utilisant quelque chose comme Live HTTPHeaders je peux voir la demande sur le site Web 3pw (étape # 1). Ensuite, les journaux Web affichent une requête du site 3pw vers mon site (étape 2), mais l'entrée la plus proche dans les journaux est une nouvelle demande à la page de connexion de mon site.

login.aspx?ReturnUrl=mypage.aspx 

Le 3pw ne sait pas comment gérer la redirection vers la page de connexion, puis échoue. La question est pourquoi mon site pense-t-il que l'utilisateur n'est plus authentifié lorsque la requête arrive de 3pw à mypage.aspx? J'ai regardé mes cookies et le cookie créé lors de ma connexion est toujours présent. Cela ne devrait-il pas indiquer au serveur que je suis toujours un utilisateur authentifié?

Voici ce que j'ai dans mon web.config

<authentication mode="Forms"> 
    <forms defaultUrl="~/somepage.aspx" 
    loginUrl="~/login.aspx" 
     protection="All" 
    timeout="30" 
    name="MyCookieName" 
    enableCrossAppRedirects="true" 
    requireSSL="true"/> 
</authentication> 

<location path="manage"> 
    <system.web> 
    <authorization> 
     <allow roles="UserRole" /> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 
</location> 

Les utilisateurs authentifiés sont dans le rôle UserRole. La page demandée par 3pw se trouve dans le répertoire Gérer. Le 3pw n'est pas écrit en .NET et je n'ai aucun contrôle sur sa configuration.

Mise à jour:

Excusez-moi si je ne suis pas aussi clair que je pourrais être. Laissez-moi répéter les étapes.

  1. Un utilisateur se connecte à mon site Web et est authentifié.
  2. L'utilisateur accède à la page de paiement unique de mon site Web.
  3. Sur la page de paiement unique, l'utilisateur clique sur un bouton Make Payment.
  4. Le bouton Make Payment fait une requête GET à 3pw en transmettant un identifiant dans la chaîne de requête.
  5. Le 3pw voir la demande et fait une demande POST à ​​une page de vérification sur mon site Web.

C'est la publication sur la page de vérification que l'erreur se produit. Selon le fichier journal, la demande à la page de vérification est redirigée vers la page de connexion. Mon serveur Web voit la requête entrer, essaie de diffuser la page mais réalise que l'utilisateur n'est pas authentifié et redirige la demande vers la connexion. Cette partie me perturbe parce que je pensais que le serveur chercherait à voir si l'utilisateur était authentifié et comme ils le sont toujours parce que le cookie existe toujours, servez la page demandée.

Peut-être que je ne comprends pas tout le processus, mais depuis la demande à la 3pw initié à partir de mon utilisateur connecté, aucune des demandes de mon site à partir du 3pw ne tombe toujours sous mon utilisateur?

Répondre

0

Vous dites que le site tiers fait une demande à votre site (étape 2)?

Si je comprends bien, cette requête ne serait pas authentifiée car elle ne provient pas de l'utilisateur mais provient plutôt du site web de la 3ème partie.

Edit:

D'après les informations que vous avez mis à jour, mes pensées initiales étaient correctes. L'environnement d'exécution ASP.NET n'a aucun moyen de savoir que les demandes provenant du site Web de la tierce partie proviennent «de l'utilisateur», car il s'agit d'une demande POST distincte provenant d'un emplacement différent.

Il y a plusieurs façons de remédier à cette situation, d'une manière comme Daniel Auger vous suggère d'ouvrir votre page accountPostback.aspx à tout le monde. Cela fonctionnera probablement assez bien pour vous.

Si vous voulez verrouiller un peu, je suppose que vous pourriez faire quelque chose comme ça (en supposant que le site web 3ème partie a une adresse IP statique):

// In Global.asax... 
void Authenticate_Request(object sender, EventArgs e) 
{ 
    if (Context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] == System.Web.Configuration.WebConfigurationManager.AppSettings["ThirdPartyWebsiteIP"]) 
    { 
     Context.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity("ThirdPartyWebsite"), new string[] {"AccountPostbackPermission"}); 
    } 
} 

et mettre à jour vos web.config appsettings:

<configuration> 
    <configSections> 
    <appSettings> 
     <add key="ThirdPartyWebsiteIP" value="127.0.0.1" /> // edit this IP address to match the 3rd party's website's IP address 
    </appSettings> 
    <configSections> 
<configuration> 

et aussi l'autorisation:

<location path="manage"> 
    <system.web> 
    <authorization> 
     <allow roles="AccountPostbackPermission" /> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 
</location> 

Bien sûr, si les s ite utilise une adresse IP dynamique cela ne fonctionnera pas et vous seriez obligé d'autoriser tout le monde à la page.

+0

Si tel est le cas, comment puis-je contourner cela. Je déteste même le suggérer, mais dois-je utiliser un iframe. – Notorious2tall

0

Pourriez-vous préciser ce que vous voulez dire par "demande"? Si vous voulez dire qu'ils commencent littéralement une requête GET ou POST de leur serveur à la vôtre, alors John Rasch a raison: ils n'ont pas votre cookie d'authentification. Si vous voulez dire qu'ils rediriger vers votre site, alors le navigateur de l'utilisateur authentifié fait la demande, auquel cas il semble que cela devrait fonctionner.

Clarifier s'il vous plaît ... merci!

+0

Mis à jour ma question. – Notorious2tall

+0

Oui, après mon GET à leur URL. Ils font un POST à ​​l'une de mes pages. – Notorious2tall

0

Si vous souhaitez que le site Web d'un tiers s'affiche sur une page de votre site Web, vous devez créer une exception pour cette page dans la configuration d'authentification par formulaire. Vous ne souhaitez pas que la page en cours de publication soit protégée.

exemple de permettre une ressource à déprotéger:

<location path="accountPostback.aspx"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
Questions connexes