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
- Le premier utilisateur, John, qui visite le SiteA (pas encore connecté) est redirigé vers AuthSite.
- 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.
- 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
- L'utilisateur John s'est connecté avec succès au SiteA en utilisant AuthSite, il essaie maintenant de visiter le SiteB.
- SiteB constate que l'utilisateur n'est pas connecté, il est donc dirigé vers AuthSite.
- AuthSite constate que l'utilisateur possède déjà un cookie pour le site Web d'AuthSite.
- AuthSite redirige l'utilisateur vers SiteB avec le secret d'authentification.
- SiteB vérifie le secret et permet à John de poursuivre sa visite en toute sécurité. sécurisées.