7

मेरे पास एक ऐसा नियंत्रण है जिसे मैंने लिखा है जिसमें जावास्क्रिप्ट घटक और एक वेब सेवा घटक है।मैं एएसपीनेट फॉर्म प्रमाणीकरण/सत्र को सेट अंतराल AJAX वेब सेवा कॉल में नवीनीकरण से कैसे रोकूं?

Alert.SiteAlertService.GetAlerts(this._receivedAlertsHandler, this._errorReceivedAlertsHandler); 

तो यह वेब सेवा जावास्क्रिप्ट प्रॉक्सी का प्रयोग किया जाता है:

setInterval(this._checkAlertsHandler, this._messageCheckInterval * 1000); 

यह एक समारोह जो इतनी तरह एक वेब सेवा कॉल करता है कहता है: समस्या मैं आ रही है कि जावास्क्रिप्ट करने के लिए सेट कर दिया जाता है वेब सेवा तक पहुंचने के तरीके। मुद्दा यह है कि हमारे आवेदन में प्रमाणीकरण और टाइमआउट मान बन गया है, इसलिए यदि उपयोगकर्ता बहुत लंबे समय तक निष्क्रिय है तो यह उन्हें लॉग आउट कर देगा।

मेरी webservice कॉल स्पष्ट रूप से कुकी भेजती है जिसमें वेब सेवा के लिए सत्र और प्रपत्र प्रमाणीकरण कुंजी शामिल होती है। एएसपीनेट webservice तब स्वचालित रूप से सत्र और फॉर्म प्रमाणीकरण नवीनीकृत करता है। जब भी जावास्क्रिप्ट वेब सेवा हिट करता है तो यह मूल रूप से उपयोगकर्ता को जीवित रखता है। मुझे यह व्यवहार नहीं चाहिए, यह सिर्फ उस पर बाधा डालना चाहिए, ताकि यह जेएस नए संदेशों की जांच करने के लिए वेब सेवा मार रहा हो, भले ही उपयोगकर्ता ने हमारे आवेदन पर पोस्टबैक नहीं किया है (और प्रभावी रूप से निष्क्रिय है) अभी भी उन्हें लॉग आउट करें। यह नहीं हो रहा है :(

मैं क्या करना चाहूंगा कि वेब सेवा के लिए यह अंतराल कॉल किसी भी प्रमाणीकरण को नवीनीकृत नहीं करता है (सत्र नवीनीकरण मैं एक कुंजीपटल स्तर परिवर्तक का उपयोग करके कुंजीपटल कुंजी/मूल्य के साथ प्राप्त कर सकता हूं उन सत्र id, तो मैं न किसी भी सत्र स्तर चर का उपयोग करने के लिए)

कैसे मैं कि यह/अपने वेब सेवा/या नियंत्रण का तरीका बदल मैं यह चाहते की तरह काम करने के लिए?

उत्तर

0

आप बाहर कर सकते हैं करते हैं। प्रपत्र प्रमाणीकरण से आपकी webservice:

<location path="yourwebservice.asmx"> 
    <system.web> 
     <authorization> 
      <allow users="?"/> 
     <authorization> 
    </system.web> 
</location> 

लेकिन आप शायद उपयोगकर्ता के बारे में जानकारी की जरूरत है, तो आप वेब सेवा रूपों प्रमाणीकरण का उपयोग करने के लिए कॉन्फ़िगर सकता है, लेकिन SlidingExpiration निष्क्रिय:

<location path="yourwebservice.asmx"> 
    <system.web> 
     <authentication mode="Forms"> 
      <forms slidingExpiration="false"></forms> 
     </authentication> 
    </system.web> 
</location> 

परीक्षण करने के लिए अगर रूपों कुकी समाप्त हो गई है कि क्या होता है सुनिश्चित करें। शायद आपको loginurl को फिर से परिभाषित करना होगा।

+1

मैं इस कोशिश की, अपने आवेदन के आधार में मेरी Web.config में जोड़ा। ऐसा प्रतीत होता है कि जब मेरी जावास्क्रिप्ट webservice को हिट करती है, तो यह अभी भी इसे नवीनीकृत कर रही है ... - मेरे पास साइट पर 1 मिनट तक टाइमआउट सेट है, और एक बार यह तार पर पहुंचने के बाद, यह सामान्य रूप से, इस जावास्क्रिप्ट के बिना चलने के बिना रीफ्रेश होगा और आपको वापस लॉगिन पेज पर डाल दिया। लेकिन जावास्क्रिप्ट चल रहा है और वेब सेवा को मार रहा है, यह रीफ्रेश करता है, और फिर भी आपको लॉग इन करता है। वेब सेवा जो इसे हिट करती है वह WebMethods पर EnableSession = true का भी उपयोग करती है और कक्षा ऑब्जेक्ट पर IRequireSessionSate भी होती है। क्या सत्र हो सकता है अपराधी यहाँ? – lslow00

+0

मैंने इसे एक ऐसी वेब सेवा पर लगाए रखने की कोशिश की जो कि बहुत ही नंगे हड्डियों थी, इसमें कोई सत्र संदर्भ नहीं है, इत्यादि हैलो दुनिया लौटने वाला एक साधारण कार्य है। जब यह सेवा को हिट करता है तो स्लाइडिंग एक्स्पेरेशन बंद नहीं होता है, क्योंकि यह उपयोगकर्ता को कभी भी लॉग आउट नहीं करेगा। – lslow00

+0

मैं वास्तव में इसका उत्तर उपयोग कर सकता हूं क्योंकि यह हमारे अनुप्रयोगों को पूरी तरह से नष्ट कर रहा है निष्क्रिय लॉगआउट तंत्र – lslow00

0

क्या आप अपनी webservice asmx फ़ाइल को अपने अलग परियोजना/समाधान/एप्लिकेशन में डाल सकते हैं?

इस तरह इसे आपके मुख्य एप्लिकेशन में एक अलग सत्र आईडी का उपयोग करना चाहिए।

5

मैं इसके साथ-साथ विभिन्न दृष्टिकोणों पर भी काम कर रहा हूं। एक तरह से मैं इसे कर रहा हूँ अजाक्स सेवा समाप्ति बिंदु को यह जोड़कर है:

// Hide the cookie so this call doesn't extend the user's ticket 
HttpContext ctx = HttpContext.Current; 
ctx.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 

इस तरह आप एक प्रमाणीकरण टिकट नवीकरण नकारना कर सकते हैं, साइन अद्यतन कुकी इसे वापस ग्राहक को कभी नहीं होगा।

यदि आपके पास कई अजाक्स एंडपॉइंट्स हैं जिन्हें आप बाहर करना चाहते हैं, तो उन मॉड्यूल को पहचानने के लिए एक मॉड्यूल लागू किया जा सकता है और कुकी को प्रतिक्रिया से निकालने के लिए कोड शामिल किया जा सकता है।

+0

शानदार ढंग से सरल! – Gaz

+0

मुझे बिल्कुल वही समस्या थी और यह ठीक हो गया। स्वीकृत उत्तर होना चाहिए। – Stuart

1

@RyanW ने मुझे जिस उत्तर की आवश्यकता है, प्रदान किया है, इसलिए यहां चीजों को शुष्क रखने के लिए एक विशेषता का उपयोग करके एमवीसी के लिए मेरा कार्यान्वयन है।

using System.Web.Mvc; 
using System.Web.Security; 

namespace Your.Web.Attributes 
{ 
    public class RemoveAuthCookieAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      filterContext.HttpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      base.OnActionExecuted(filterContext); 
     } 
    } 
} 

कार्यान्वयन:

[RemoveAuthCookie] 
public ActionResult PollMe() 
{ 
    return View(); 
} 
संबंधित मुद्दे