0 votes

Problème d'authentification des formulaires dans ASP.NET

J'utilise Visual Studio Team System 2008 (VSTS), C#, .NET 3.5, IIS 7.0 et ASP.NET. J'ai deux sites Web IIS, le site A et le site B. Leurs noms de domaine associés sont, http://sitea.example.com y http://siteb.example.com .

J'ai entendu dire que lors de l'utilisation de l'authentification par formulaire, nous pouvions activer les cookies au niveau du domaine, c'est-à-dire que si deux sites sont dans le même domaine (par exemple, tous les deux sitea.example.com y siteb.example.com sont dans le domaine example.com ), l'utilisateur final ne doit s'authentifier qu'une seule fois. Plus précisément, si l'utilisateur est authentifié (passe l'authentification) par l'un des sites, il n'est pas nécessaire de l'authentifier à nouveau sur les autres sites.

Comment cette fonction peut-elle être activée pour mon sitea y siteb ? Dois-je modifier le web.config pour les deux types d'utilisateurs ? sitea y siteb ?

Une autre confusion est, si l'utilisateur est authentifié par sitea il est sûr que l'identité de l'utilisateur est reconnue par sitea mais comment siteb reconnaître l'identité de l'utilisateur sans l'authentifier à nouveau ?

8voto

blowdart Points 28735

En supposant que les deux sites partagent la même base de données d'adhésion, vous pouvez définir le domaine du cookie dans le champ l'authentification des formulaires de la section web.config ;

<authentication mode="Forms">
    <forms .... domain="mycorp.com"/>
</authentication>

Notez que vous devrez également mettre en place des correspondances clés de machine dans le web.config car ils sont utilisés pour signer le cookie d'authentification.

3voto

Henk Holterman Points 153608

Il existe un exemple sur MSDN .

2voto

Jonathan Parker Points 4206

Ce lien donne quelques détails http://docs.communityserver.com/2007/270-common-things-to-check-when-using-forms-authentication/

En gros, vous devez ajouter l'attribut domain dans le fichier <forms/> à l'intérieur de la balise <authentication> du fichier web.config.

par exemple

<authentication mode="Forms">
<forms name=".CookieName" ... domain=".mydomain.com" />
</authentication>

1voto

Chuck Conway Points 10293

Définissez l'attribut de domaine à .mycorp.com dans la balise de formulaire de l'application web.config

0voto

Akash Kava Points 18026

Je suggérerais de faire comme Stack Overflow, Microsoft, Facebook, Google Accounts, et c'est encore plus efficace car chaque site web peut être sur n'importe quelle machine différente.

Supposons que vous ayez AuthSite. Il s'agit du seul site sur lequel vous devez vous connecter et qui contient des informations sur les membres.

Et vous avez SiteA, SiteB, et SiteC sur des serveurs différents.

Sur la page de connexion du SiteA, vous devez configurer un post form avec un secret sur AuthSite.

Si vous vous étiez précédemment connecté avec succès sur AuthSite, il sera simplement redirigé vers SiteA avec le secret de la réussite sous la forme d'un formulaire caché dans le navigateur, que vous devez vérifier dans SiteA.

Ce modèle est hautement extensible et évolutif. Parce que la maintenance à long terme est facile.

Le code sur la page de connexion du site A, du site B et du site C est le suivant.

Login.aspx sur le SiteA, le SiteB et le SiteC :

private void Page_Load(object sender, EventArg e){
   // Simply redirect back to AuthSite...
   // Change Site parameter accordingly.
   Response.Redirect("http://authsite/Login.aspx?Site=SiteA");
}

Login.aspx sur AuthSite :

// Define one hidden field named "ReturnSite".

private void Page_Load(object sender, EventArg e){

   if(IsPostBack)
       return;
   string site = Request.QueryString["Site"];
   if(Request.User.IsAuthenticated){
       string secrete = CreateSomeSecrete(site);
       Response.Redirect("http://" + site + 
           "/AuthConfirm.aspx?Token=" + secrete + 
           "&User=" + Request.User.Identity.Name);
       return;
   }

   ReturnSite.value = site;
   // Do usual login...
}

private void LoginButton_Click(object sender, EventArg e){
   string secrete = CreateSomeSecrete(ReturnSite.value);
   FormAuthentication.SetAuthCookie(username,true);
   // You can retrive username later by calling 
   // Request.User.Identity.Name.
   Response.Redirect("http://" + ReturnSite.value + 
      "/AuthConfirm.aspx?Token=" + secrete + "&User=" + username);
}

AuthConfirm.aspx sur SiteA, SiteB et SiteC :

private void Page_Load(object sender, EventArg e){
   string secrete = Request.QueryString["Token"];
   // Verify that secret came only from AuthSite.
   if(VerifySecrete(secrete)){
       // This sets authentication cookie for Current Site
       FormsAuthentication.SetAuthCookie(Request.QueryString["User"], true);
   }
}

Voyons maintenant un autre scénario.

Même utilisateur, première connexion

  1. Le premier utilisateur, John, qui visite le SiteA (pas encore connecté) est redirigé vers AuthSite.
  2. AuthSite vérifie et constate que l'utilisateur n'a pas de cookie d'authentification, les informations d'identification réelles sont donc demandées.
  3. AuthSite définit le jeton sur lui-même et passe le secret à la page AuthConfirm sur SiteA. Le site A vérifie le jeton, définit le cookie d'authentification et permet à l'utilisateur de visiter des pages sécurisées.

Même utilisateur, première fois sur le SiteB

  1. L'utilisateur John s'est connecté avec succès au SiteA en utilisant AuthSite, il essaie maintenant de visiter le SiteB.
  2. SiteB constate que l'utilisateur n'est pas connecté, il est donc dirigé vers AuthSite.
  3. AuthSite constate que l'utilisateur possède déjà un cookie pour le site Web d'AuthSite.
  4. AuthSite redirige l'utilisateur vers SiteB avec le secret d'authentification.
  5. SiteB vérifie le secret et permet à John de poursuivre sa visite en toute sécurité. sécurisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X