2009-09-23 7 views
1

J'ai une application asp.net MVC sur laquelle je travaille et j'ai écrit un actionfilter personnalisé afin de filtrer certaines actions du contrôleur en fonction des niveaux d'autorisation qui sont définis lors de la connexion et stockés dans un cookie chiffré à côté du cookie formsauthentication, les deux cookies sont configurés pour avoir le même temps d'expiration mais pour une raison quelconque après un certain temps d'inactivité la valeur du cookie d'autorisation devient vide, je n'ai pas été capable de déboguer et de l'attraper dans l'acte mais disparaîtValeur de cookie expirant avant l'expiration du cookie

mon code ActionFilter ressemble à ceci:

string usersRole = ""; 
if (filterContext.HttpContext.Session["role"] != null) 
usersRole = filterContext.HttpContext.Session["role"].ToString(); 
else if (filterContext.HttpContext.Response.Cookies["ArisPortalCookie"].Value != null) 
{ 
usersRole = filterContext.HttpContext.Response.Cookies["ArisPortalCookie"].Value; 
filterContext.HttpContext.Session["role"] = usersRole; 
} 
string encryptedRole = EncryptionHelper.Encrypt(RoleToCheckFor); 

if (encryptedRole == usersRole || usersRole == EncryptionHelper.Encrypt("Admin")) //if the user's role and role required match, we have success 
     { 
      //now we break down the response action based on what role was required 
      if (RoleToCheckFor == "Admin") 
      { 
      } 
      else if (RoleToCheckFor == "Tech" || RoleToCheckFor == "Admin") 
      { 

      } 
      else if (RoleToCheckFor == "Physician" || RoleToCheckFor == "Admin") 
      { 

      } 
     } 
     else 
     { 
      filterContext.Result = new ViewResult 
      { 
       ViewName = "NoAuth", 
       ViewData = filterContext.Controller.ViewData, 
       TempData = filterContext.Controller.TempData 
      }; 
     } 
+0

trouvé un problème possible, mon application stocke un cookie d'identification de session qui semble effacer ma valeur du cookie quand il arrive à expiration – Jimmy

Répondre

2

Je fais la même pour stocker les rôles. Pourquoi les avoir côte à côte?

Je suppose que vous faites quelque chose comme ceci:

FormsAuthenticationTicket authTicket = 
       new FormsAuthenticationTicket(1, 
              username, 
              DateTime.Now, 
              DateTime.Now.AddMinutes(60), 
              rememberMe, 
              roles); 
      string encTicket = FormsAuthentication.Encrypt(authTicket); 
      HttpCookie authenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
      authenticationCookie.HttpOnly = true; 
      contextBase.Response.Cookies.Add(authenticationCookie); 

Si vous utilisez FormsAuthentication.SetAuthCookie aussi bien, que je ne pense pas que vous devez et je ne pas, alors assurez-vous que votre config a timeout réglé à 60 minutes ou équivalent à votre temps ci-dessus.

valeurs de lecture (format canalisé) de cookie (comme demandé)

private static void ReadCookieForPrincipal() 
{ 
    string cookieName = FormsAuthentication.FormsCookieName; 
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[cookieName]; 

    // If the cookie can't be found, don't issue the ticket 
    if (authCookie == null) return; 

    // Get the authentication ticket and rebuild the principal & identity 
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
    string[] roles = authTicket.UserData.Split(new Char[] { '|' }); 
    GenericIdentity userIdentity = new GenericIdentity(authTicket.Name); 
    GenericPrincipal userPrincipal = new GenericPrincipal(userIdentity, roles); 
    HttpContext.Current.User = userPrincipal; 
} 
+0

esprit montrant comment vous ajoutez des rôles au cookie formsauth puis récupérez ces valeurs? – Jimmy

+0

oui c'est quoi im faire moins les rôles cloués à la fin du cookie, comment tirer les données des rôles sur le cookie formsauth? – Jimmy

+0

en partageant votre code qui vérifie le rôle de l'utilisateur? – Jimmy