2010-10-15 19 views
5

में प्रपत्र प्रमाणीकरण टिकट कुकी का उपयोग कर कस्टम IIdentity और IPrincipal मैं वर्तमान में एक एएसपी.नेट एमवीसी 2 वेब अनुप्रयोग में कुछ कस्टम सुरक्षा को लागू करने की कोशिश कर रहा हूं।एमवीसी 2

मैं अगर मैं अपने नियंत्रक क्रियाओं में से एक पर [Authorize(Roles="Admins")] विशेषता का उपयोग शो नीचे मेरी कोड के रूप में, लेकिन किसी कारण से बहुत आसान कुछ करने के लिए कोशिश कर रहा हूँ, जाँच Context.User.IsInRole("Admins") या Page.User.IsInRole("Admins") यह हमेशा गलत है।

यह भी अजीब है कि User.Identity.Name भी खाली है।

नीचे मेरी कोड है, मैं एक कुकी जो मैं तो मेरे Gloabl.asax भीतर Application_AuthenticateRequest घटना हैंडल में प्रयोग कर एक GenericPrincipal वस्तु के साथ Context.User स्थापित करने के लिए के भीतर एक FormsAuthenticationTicket उपयोग कर रहा हूँ देखें।

मेरा प्रवेश कोड:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Login(string username, string password) 
     { 

      //this would obviously do a check against the supplied username and password 
      if (true) 
      { 
       FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, 
       DateTime.Now.AddMinutes(15), false, "Admins|Users|Members"); 

       string encTicket = FormsAuthentication.Encrypt(ticket); 

       HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 

       this.Response.Cookies.Add(cookie); 
       string url = FormsAuthentication.GetRedirectUrl(username, false); 

       Response.Redirect(url);    
      } 


      return View(); 

     } 

मेरे Global.asax कोड:

 void MvcApplication_AuthenticateRequest(object sender, EventArgs e) 
     { 
      HttpApplication application = (HttpApplication)sender; 
      HttpContext context = application.Context; 

      var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName]; 

      if (cookie != null) 
      {     

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

       context.User = userPrincipal; 

      } 

एक बार मैं ऊपर मैं घड़ी विंडो में देख सकते हैं context.User सेट और वस्तु पूरी तरह से सेट किया गया है, सही नाम आदि के साथ सही भूमिकाओं में, हालांकि यदि मैं नियंत्रक क्रियाओं को आजमाता हूं और लॉक करता हूं या प्रिंसिपल का उपयोग अपनी साइट पर कहीं से भी करता हूं तो यह हमेशा एक खाली स्ट्रिंग पर सेट होता है जिसमें कोई भूमिका नियुक्त नहीं होती है !!

मुझे लगता है कि मैं वास्तव में कुछ बेवकूफ कर रहा हूं लेकिन अगर कोई इसे इंगित कर सकता है तो मैं वास्तव में इसकी सराहना करता हूं।

+0

यू पोस्ट करें कर सकते हैं, सेटिंग्स रूपों कृपया? –

+0

मुझे एक ही समस्या है – Mohsen

उत्तर

2

चेक कि आप अपना नया userPrincipal बताए जाते हैं दोनों HttpContext और Global.asax में OnPostAuthenticate अनुरोध के भीतर मौजूदा धागा: अपने web.config

HttpContext.Current.User = userPrincipal; 
Thread.CurrentPrincipal = userPrincipal; 
+0

मैंने कोशिश की है और अभी भी कोई भाग्य नहीं है :( – MarkB29

संबंधित मुद्दे