2010-10-07 3 views
1

J'ai une application web de base de code qui est connectée à 2 bases de données. Selon le contrôle de connexion qu'un utilisateur utilise pour se connecter, une base de données différente est connectée au code. Je fais tout cela par un cookie. Ce cookie est dans une classe publique appelée AuthenticatedUser. La classe ressemble à ceci:Forcer le contrôle de connexion .net pour que l'utilisateur se déconnecte si un cookie est nul

public class AuthenticatedUser : System.Web.UI.Page 
{ 
    public static string ConnectionString 
    { 
     get 
     { 
      HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"]; 
      return GetConnectionStringFromName(myCookie); 
     } 
     set 
     { 
      if (HttpContext.Current.Request.Cookies["connectionString"] != null) 
      { 
       ExpireCookies(HttpContext.Current); 
      } 
      var allCookies = HttpContext.Current.Request.Cookies.AllKeys; 
      HttpCookie cookie = new HttpCookie("connectionString"); 
      cookie.Value = value; 
      cookie.Expires = DateTime.Now.AddYears(100); 
      HttpContext.Current.Response.Cookies.Add(cookie); 
     } 
    } 

    private static string GetConnectionStringFromName(HttpCookie myCookie) 
{ 
    try 
    { 
     string connectionStringName = myCookie.Value; 
     return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
    } 
    catch 
    { 
     FormsAuthentication.SignOut(); 
    } 
    finally 
    { 
     HttpContext.Current.Response.Redirect("/default.aspx"); 
    } 
    return ""; 

}  private static void ExpireCookies(HttpContext current) 
    { 
     var allCookies = current.Request.Cookies.AllKeys; 
     foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null)) 
     { 
      cook.Value = ""; 
      cook.Expires = DateTime.Now.AddDays(-1); 
      current.Request.Cookies.Remove(cook.Name); 
      cook.Name = ""; 
     } 
    } 
} 

Cela semble fonctionner sur ma machine de développement, mais quand j'ai essayé de le déployer, tout utilisateur qui utilisait l'option « Se souvenir de moi » sur le site obtenait une référence null erreur car ils n'ont pas utilisé le contrôle de connexion pour obtenir le cookie.

Quelle est la meilleure méthode pour contourner ce problème? Je pensais que si un utilisateur était connecté mais que la classe AuthenticatedUser ne pouvait pas obtenir une Connectionstring pour se déconnecter de l'utilisateur pour les forcer à utiliser à nouveau le contrôle de connexion. Que devrais-je faire?

Répondre

1

utilisation Try:

try 
{ 
     FormsAuthentication.SignOut(); 
} 
finally 
{ 
     Response.Redirect("~/Home.aspx"); 
} 

De cette façon est préférable, par exemple, si dans quelque temps, vous déciderez auth sans but cookie, mais URL en fonction - la FormsAuthentication gérerez gracieusement.

+0

J'ai mis à jour le code, c'est ce que vous pensiez? J'essaie de le tester sur ma machine de développement mais j'ai du mal à replacer le problème. Est-ce structuré de la bonne façon? – EvanGWatkins

+0

@EvanGWatkins - en fait FormsAuthentication.SignOut() efface les cookies d'authentification (à condition que vous soyez authentifié par ASP.Net de manière standard, ou au moins par FormsAuthentication.SetAuthCookie). Vous n'avez donc pas besoin de le supprimer manuellement. – Dewfy

+0

Pouvez-vous expliquer un peu plus? Le login de l'adhésion est le login standard, donc tout ce que je dois faire est de vérifier le cookie (dans l'essai) s'il y est bien, continuer à bouger, s'il est nul, déconnecter l'utilisateur et le rediriger vers la connexion. – EvanGWatkins

Questions connexes