2014-05-21 2 views
0

J'ai une méthode d'identification pour définir les informations d'identification de l'utilisateur via GenericPrincipal. J'utilise asp.net MVCGenericPrincipal IsInRole renvoie false pour HttpContext.User

public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie) 
    { 
     FormsAuthentication.SetAuthCookie(username, createPersistenceCookie); 

     IIdentity identity = new GenericIdentity(username); 
     IPrincipal principal = new GenericPrincipal(identity,new []{"standart"}); 

     context.User = principal; 
    } 

Je veux vérifier User.IsInRole ("Standart") dans l'action du contrôleur, mais il retourne faux.

  • context.User.IsInRole ("Standart") // renvoie false

Je veux utiliser context.User dans ma demande, mais il retourne toujours faux.

+0

L'utilisateur de contexte est-il le même que CurrentPrincipal? – Prescott

+0

Le fait que 'Thread.CurrentPrincipal.IsInRole (" standart ")' renvoie true contredit le titre de votre message. Je vous recommande d'enquêter si Thread.CurrentPrincipal et context.User sont la même instance que votre «principal». – chiccodoro

Répondre

1

Je pense que vous avez déjà utilisé l'API asp.net auparavant. Et maintenant vous voulez créer le principal personnalisé dans votre application. Lorsque vous envoyez une requête au serveur, le serveur utilise un nouveau HttpContext propre. Vous avez donc perdu vos anciennes informations. Si vous souhaitez utiliser les anciennes informations de session, vous devez enregistrer vos données côté serveur ou côté client. Vous pouvez le faire dans les deux sens.

  • cookie client
  • session serveur

Je vous recommandons d'utiliser les cookies clients. Parce que les données sont stockées côté client, vous économisez les ressources du serveur.

public void SetCredentials(HttpContextBase context, string username, bool createPersistenceCookie) 
    { 
     var formsAuthenticationTicket = new FormsAuthenticationTicket(
      1, 
      username, 
      DateTime.Now, 
      DateTime.Now.AddMilliseconds(FormsAuthentication.Timeout.TotalMilliseconds), 
      createPersistenceCookie, 
      roles 
     ); 

     var encryptedTicket = FormsAuthentication.Encrypt(formsAuthenticationTicket); 
     var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

     HttpContext.Current.Response.AppendCookie(authCookie); 
    } 

J'ai envoyé un cookie crypté au côté client. Et je devrais vérifier ce cookie toutes les demandes entrantes à l'application serveur.

Et maintenant dans fichier Global.asax:

protected void Application_AuthenticateRequest(object sender, System.EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if (authCookie == null) return; 

     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); 

     IIdentity identity = new GenericIdentity(ticket.Name); 
     IPrincipal principal = new GenericPrincipal(identity, ticket.UserData.Split('|')); 

     HttpContext.Current.User = principal; 
    } 

J'espère résoudre votre problème.