2011-07-05 6 views
5

प्रमाणीकरण के बाद मेरा प्रवेश कोड,:ब्राउज़र पर प्रमाणीकृत काम है - लेकिन एयर क्लाइंट के साथ नहीं!

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class TJAuthorize : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
       filterContext.HttpContext.Request.Cookies == null || filterContext.HttpContext.Request.Cookies[cookieName] == null) { 
        HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 

यह सब खूबसूरती से काम करता है जब मैं एक ब्राउज़र सत्र में काम कर रहा हूँ:

var authTicket = new FormsAuthenticationTicket(
       1, 
       userName, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(20), // expiry 
       false, 
       roles, 
       "/"); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

और, Darin Dimitrov करने के लिए धन्यवाद, मैं एक कस्टम विशेषता को अधिकृत किया है। लेकिन अब मैं एक फ्लैश/एडोब एयर क्लाइंट के साथ काम कर रहा हूं, और प्रमाणीकरण विशेषता विफलता पैदा कर रही है। कोड में डिबग बयान डाल करके, मुझे लगता है कि बता सकते हैं:

filterContext.HttpContext.User.Identity.IsAuthenticated 

गलत है - एक सफल प्रवेश के बाद भी!

ब्राउज़र क्लाइंट और एयर क्लाइंट का उपयोग करने के बीच कोई अंतर क्यों होना चाहिए? और मैं इसे कैसे ठीक करूं?

संपादित करें: एक और सुराग: कुछ और डिबग बयान में डालने के बाद, मैं पाया है filterContext.HttpContext.User.Identity सही ढंग से सेट नहीं है कि जब एयर से कॉल कर - Name संपत्ति बाहर खाली आता है! सत्र आईडी सही है, कुकी आईडी सही है - लेकिन User.Identity सेट नहीं है। कोई विचार यह क्यों हो रहा है?

उत्तर

4

शायद HttpCookieMode (http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx) गलत मान पर सेट है?

डिफ़ॉल्ट उपयोग हैडिवाइसप्रोफाइल ... क्या होता है जब आप इसे कुकीजियों पर मजबूर करते हैं?

+0

कमाल - मैंने '' टैग को '<प्रमाणीकरण>' में 'cookieless = "UseCookies" 'जोड़ा' और अब यह काम करता है! आप प्रतिभा, आप! :) –

+0

हाँ !! धन्यवाद जी-डी! ... यह एक टीम प्रयास था - महान काम शॉल! हमें सही दिशा में सोचने में मदद करने के लिए धन्यवाद @ vnuk! – davidkomer

2

यह एक लंबा शॉट है, लेकिन यह प्रमाणीकृत क्लाइंट की एएसपीएक्सएथ कुकी (या जिसे आपने आईडी नाम दिया है) पर अनुरोध के साथ भेजा जा रहा है। सुनिश्चित करें कि फ्लैश/एयर उस कुकी को भेज रहा है (वायरशर्क या किसी अन्य नेटवर्क उपकरण द्वारा)

+0

हाँ, अच्छा विचार है, लेकिन मैं एएसपीएक्सएथ कुकी भेज रहा हूं, यह जांच कर चुका है कि प्रमाणीकरण के बाद क्या किया जा रहा है ... –

+0

हवाई अनुरोध में कुछ अलग होना चाहिए। वायरसहार्क के साथ दोनों अनुरोधों को कैप्चर करें और उनकी तुलना करें। – Vnuk

+0

मैं इस पर शॉल के साथ काम कर रहा हूं ... हम चार्ल्स का उपयोग कर रहे हैं और कुकीज में कोई अंतर नहीं है (हालांकि अन्य पैरामीटर में अंतर हैं) – davidkomer

0

क्या HttpContext.User.Identity global.asax में Application_AuthorizeRequest में दिखाई देता है?

+0

अन्यत्र के समान व्यवहार - जब ब्राउज़र से कहा जाता है, हाँ ; जब हवा से कहा जाता है, नहीं। –

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