FormsAuthentication.SignOut () उपयोगकर्ता को लॉग आउट नहीं करता है


143

इस के खिलाफ मेरा सिर थोड़ा बहुत लंबा है। मैं एक उपयोगकर्ता को साइट के पृष्ठों को ब्राउज़ करने से कैसे रोक सकता हूं, क्योंकि वे फॉर्म-ऑथेंटिकेशन.सिग्नॉट का उपयोग करके लॉग आउट किए गए हैं? मैं यह करने के लिए यह उम्मीद करेंगे:

FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();

लेकिन यह नहीं है। यदि मैं सीधे URL में टाइप करता हूं, तब भी मैं पेज पर ब्राउज़ कर सकता हूं। मैंने कुछ समय में रोल-योर सिक्योरिटी का उपयोग नहीं किया है इसलिए मैं भूल गया कि यह काम क्यों नहीं करता है।


यह कोड ठीक है जैसा कि ... ब्राउज़र में वापस क्लिक करने से पृष्ठ पर सर्वर पर फिर से नहीं आता है यह केवल पृष्ठ के स्थानीय कैश्ड संस्करण को फिर से लोड करता है। नीचे दिए गए सभी समाधान उस तथ्य को नजरअंदाज करते हुए प्रतीत होते हैं और वास्तव में आपके द्वारा किए जा रहे कार्यों से अधिक कुछ भी नहीं करते हैं। संक्षेप में ... इस सवाल का कोई जवाब नहीं है जो उपयोगकर्ता को अपने कैश को देखने के लिए हल करेगा क्योंकि आज तक मुझे विश्वास नहीं हुआ कि कैश को साफ करने का एक तरीका है ... js या सर्वर साइड इंस्ट्रक्शन के साथ।
वार

यह उत्तर जांचने के कुछ तरीके प्रदान करता है, खासकर यदि आप साइट पीएन परीक्षण विफल कर रहे हैं: stackoverflow.com/questions/31565632/…
टायलर एस। लोपर

जवाबों:


211

उपयोगकर्ता अभी भी आपकी वेबसाइट को ब्राउज़ कर सकते हैं क्योंकि जब आप कॉल करते हैं तो कुकीज़ साफ़ नहीं होती हैं FormsAuthentication.SignOut()और उन्हें हर नए अनुरोध पर प्रमाणित किया जाता है। एमएस प्रलेखन में कहा गया है कि कुकी को साफ कर दिया जाएगा, लेकिन वे बग नहीं करते हैं? इसके साथ बिल्कुल वैसा हीSession.Abandon() , कुकी अभी भी है।

आपको अपना कोड इसमें बदलना चाहिए:

FormsAuthentication.SignOut();
Session.Abandon();

// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);

// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

FormsAuthentication.RedirectToLoginPage();

HttpCookieमें है System.Webनाम स्थान। MSDN संदर्भ


18
यह मेरे लिए काम करता है। हालाँकि यह ध्यान देने योग्य है कि यदि लॉग इन करते समय डोमेन संपत्ति फॉर्म्युथेनेशन कुकी पर सेट की गई है, तो आपको लॉग आउट करते समय कुकी को समाप्त करते समय इसे सेट करने की भी आवश्यकता होगी
फिल हेल

8
इसके अलावा मत भूलना cookie1 को ।
दिमित्री ज़ेट्स

6
यह मेरे लिए एक बेहतर समाधान की तरह लगता है: Response.Cookies [FormsAuthentication.FormsCookNName] .Expires = DateTime.Now.AddDays (-1);
रैंडी एच।

7
@RandyH। एक नई खाली कुकी के साथ मौजूदा FormAuthentication कुकी को ओवरराइड करने से यह सुनिश्चित होता है कि भले ही ग्राहक अपने सिस्टम की घड़ी को वापस कर दें, फिर भी वे कुकी से किसी भी उपयोगकर्ता डेटा को प्राप्त नहीं कर पाएंगे।
ट्राई क्यू ट्रान

9
क्या कोई इन सभी टिप्पणियों को उत्तर में जोड़ सकता है?
डेविड

22

ऊपर की दो पोस्टिंग का उपयोग करके x64igor और फिल हैसेलडन ने इसे हल किया:

1. x64igor ने लॉगआउट करने के लिए उदाहरण दिया:

  • आपको सबसे पहले जरूरत है रिस्पॉन्स में लॉगआउट करने के लिए खाली कुकीज़ को वापस करके प्रमाणीकरण कुकी और सत्र कुकी साफ़

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        Session.Clear();  // This may not be needed -- but can't hurt
        Session.Abandon();
    
        // Clear authentication cookie
        HttpCookie rFormsCookie = new HttpCookie( FormsAuthentication.FormsCookieName, "" );
        rFormsCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rFormsCookie );
    
        // Clear session cookie 
        HttpCookie rSessionCookie = new HttpCookie( "ASP.NET_SessionId", "" );
        rSessionCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rSessionCookie );

2. फिल हैसेलडेन ने लॉगआउट के बाद कैशिंग को रोकने के तरीके के ऊपर उदाहरण दिया:

  • आपको रिस्पांस के माध्यम से क्लाइंट साइड पर कैश को अमान्य करने की आवश्यकता है ।

        // Invalidate the Cache on the Client Side
        Response.Cache.SetCacheability( HttpCacheability.NoCache );
        Response.Cache.SetNoStore();
    
        // Redirect to the Home Page (that should be intercepted and redirected to the Login Page first)
        return RedirectToAction( "Index", "Home" ); 
    }

1
इस समस्या को हल करने के लिए काम पर पूरा दिन बर्बाद कर दिया। एक बार लॉगआउट बटन में लॉग इन करने पर कंट्रोलर (लॉग इन लॉगआउट नहीं) में गलत एक्शन आने लगा। धन्यवाद, इससे समस्या हल हो गई। विकास पर्यावरण: ASP.NET 4.51 एमवीसी 5.1
एको

1
अच्छा उत्तर! विनम्र सुझाव: सत्र कुकीज x64igor को साफ़ करने के लिए फ़ॉर्म का उपयोग करें SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); HttpCookie sessionCookie = new HttpCookie(sessionStateSection.CookieName, "");:। सामान्य तौर पर, सत्र कुकी नाम नहीं है "ASP.NET_SessionId"
देखिए बिस्किट

20

मुझे लगता है जैसे आपके पास आपका web.config प्राधिकरण अनुभाग ठीक से स्थापित नहीं है। एक उदाहरण के लिए नीचे देखें।

<authentication mode="Forms">
  <forms name="MyCookie" loginUrl="Login.aspx" protection="All" timeout="90" slidingExpiration="true"></forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>

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

डिफ़ॉल्ट रूप से फिसलने की क्रिया सही ( msdn.microsoft.com/library/1d3t3c61(v=vs.100).aspx ) पर सेट है । और इसका परिणाम अंत में कुकी को x मिनट के बाद अमान्य हो जाएगा जैसा कि टाइमआउट में सेट किया गया है - और तब नहीं जब उपयोगकर्ता साइनऑउट () के माध्यम से लॉग इन हो। तो यह प्रपत्र व्यवहार के उपयोग से उपयोगकर्ता को लॉग इन करने के लिए इच्छित व्यवहार का परिणाम नहीं होगा। अगर मैं गलत हूं कृपया मुझे सही।
ओलाफीडब्ल्यू

12

यहां कुंजी यह है कि आप कहते हैं "यदि मैं सीधे URL में टाइप करता हूं ..."।

डिफ़ॉल्ट रूप से प्रमाणीकरण के तहत उपयोगकर्ता के लिए ब्राउज़र कैश पृष्ठों को प्रमाणित करता है। इसलिए, ब्राउज़र से सीधे एक URL का चयन करें बॉक्स ड्रॉपडाउन, या इसे टाइप करके, MAY को ब्राउज़र के कैश से पृष्ठ मिलता है, और प्रमाणीकरण / प्राधिकरण की जांच करने के लिए सर्वर पर वापस कभी न जाएं। इसका समाधान प्रत्येक पृष्ठ के Page_Load घटना में या आपके आधार पृष्ठ के OnLoad () में क्लाइंट-साइड कैशिंग को रोकने के लिए है:

Response.Cache.SetCacheability(HttpCacheability.NoCache);

आप कॉल करना भी पसंद कर सकते हैं:

Response.Cache.SetNoStore();

11

मैं इससे पहले भी संघर्ष कर चुका हूं।

यहाँ जो चल रहा है, उसके लिए एक सादृश्य है ... एक नया आगंतुक, जो, साइट पर आता है और लॉग इन पेज के माध्यम से लॉग इन करता है। ASP.NET जो के लिए एक नई पहचान बनाता है, और उसे एक कुकी देता है। वह कुकी घर की चाबी की तरह है, और जब तक जो उस चाबी के साथ लौटता है, वह ताला खोल सकता है। प्रत्येक आगंतुक को एक नई कुंजी और उपयोग करने के लिए एक नया लॉक दिया जाता है।

कब FormsAuthentication.SignOut() कहा जाता है, तो सिस्टम कुंजी को खोने के लिए जो बताता है। आम तौर पर, यह काम करता है, क्योंकि जो के पास अब चाबी नहीं है, वह अंदर नहीं जा सकता।

हालांकि, अगर जो कभी वापस आता है, और करता है कि खो कुंजी है, वह वापस जाने है!

मैं जो बता सकता हूं, उसमें दरवाजे पर ताला बदलने के लिए ASP.NET बताने का कोई तरीका नहीं है!

जिस तरह से मैं इसके साथ रह सकता हूं वह है एक सत्र चर में जो का नाम याद रखना। जब वह बाहर निकलता है, तो मैं सत्र को छोड़ देता हूं, इसलिए मेरा नाम अब नहीं है। बाद में, यह जाँचने के लिए कि क्या उसे अनुमति दी गई है, मैं बस उसकी पहचान की तुलना करता हूँ। वर्तमान सत्र में क्या है, और यदि वे मेल नहीं खाते हैं, तो वह एक वैध आगंतुक नहीं है।

संक्षेप में, एक वेब साइट के लिए, User.Identity.IsAuthenticatedअपने सत्र चर की जाँच किए बिना भी भरोसा न करें!


8
+ 1, मुझे लगता है कि इसे 'कुकी रीप्ले अटैक' कहा जाता है। FormsAuthentication.SignOut की सीमाओं पर एक लेख है: support.microsoft.com/kb/900111
दिमित्री

3
ऊपर दिए गए लिंक का अनुसरण करने वाले किसी भी व्यक्ति के लिए, यह मृत है। आप यहां इस पृष्ठ की एक प्रति प्राप्त करने के लिए WaybackMachine का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह IMMEDIATELY उपयोगकर्ता को पुनर्निर्देशित करने का प्रयास करता है। web.archive.org/web/20171128133421/https://…
killa-byte

7

बहुत खोज के बाद आखिरकार मेरे लिए यह काम किया। मुझे उम्मीद है यह मदद करेगा।

public ActionResult LogOff()
{
    AuthenticationManager.SignOut();
    HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
    return RedirectToAction("Index", "Home");
}

<li class="page-scroll">@Html.ActionLink("Log off", "LogOff", "Account")</li>

मैं PHP में वर्षों से वेब एप्लिकेशन विकसित कर रहा हूं। तो मैं एमवीसी के लिए नया हूं ... मैं मानता हूं कि मैं इसे प्यार करता हूं, लेकिन जो कोई इतना आसान लगता होगा कि किसी को लॉग इन करना इतना मुश्किल होगा? मैंने इस पृष्ठ पर लाइन के नीचे हर दूसरी स्क्रिप्ट की कोशिश की और यह एकमात्र ऐसा काम है जो काम करता है। पोस्ट करने का शुक्रिया!
एंथनी ग्रिग्स

6

यह मेरे लिए काम करता है

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Request.Cookies.AllKeys)
        {
            Request.Cookies.Remove(cookie);
        }
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }

3

आपके द्वारा पोस्ट किया गया कोड ऐसा लगता है कि इसे सही तरीके से प्रमाणीकरण प्रमाणीकरण टोकन को हटा देना चाहिए, इसलिए यह संभव है कि प्रश्न में फ़ोल्डर / पृष्ठ वास्तव में संरक्षित नहीं हैं।

क्या आपने पुष्टि की है कि लॉगिन से पहले पृष्ठ को एक्सेस नहीं किया जा सकता है?

क्या आप web.config सेटिंग्स और लॉगिन कोड पोस्ट कर सकते हैं जिसका आप उपयोग कर रहे हैं?


3

मैं अपने सभी पृष्ठों के लिए एक आधार वर्ग लिख रहा हूं और मैं उसी मुद्दे पर आया हूं। मेरे पास निम्नलिखित की तरह कोड था और यह काम नहीं करता था। ट्रेसिंग के द्वारा, RedirectToLoginPage () स्टेटमेंट से कंट्रोल अगली पंक्ति में रीडायरेक्ट किए बिना अगली पंक्ति में जाता है।

if (_requiresAuthentication)
{
    if (!User.Identity.IsAuthenticated)
        FormsAuthentication.RedirectToLoginPage();

    // check authorization for restricted pages only
    if (_isRestrictedPage) AuthorizePageAndButtons();
}

मुझे पता चला कि दो समाधान हैं। या तो FormAAententication.RedirectToLoginPage () को संशोधित करने के लिए; होने के लिए

if (!User.Identity.IsAuthenticated)
    Response.Redirect(FormsAuthentication.LoginUrl);

या जोड़कर web.config को संशोधित करने के लिए

<authorization>
  <deny users="?" />
</authorization>

दूसरे मामले में, ट्रेस करते समय, नियंत्रण अनुरोधित पृष्ठ तक नहीं पहुंचा। ब्रेक प्वाइंट से टकराने से पहले इसे लॉगिन url पर तुरंत भेज दिया गया है। इसलिए, साइनऑउट () विधि समस्या नहीं है, पुनर्निर्देशित विधि एक है।

मुझे उम्मीद है कि कोई मदद कर सकता है

सादर


2
इसके अलावा, आप FormsAuthentication.RedirectToLoginPage ()
murki

मुझे लगता है कि एमएस के हिस्से पर कुछ गलतफहमी है। यदि आप चाहते हैं कि आपको लॉगिन पृष्ठ पर लौटना पड़े तो आपको लोगों को बाहर निकालना होगा। अन्यथा ढांचा उल्लासपूर्वक आपको एक्सेस करने की अनुमति देगा। तो आपको इस पोस्ट में समाधान # 2 कहना होगा।
जोश रॉबिन्सन

3

मैंने यहाँ कुछ सुझावों की कोशिश की और जब मैं ब्राउज़र बैक बटन का उपयोग करने में सक्षम था, जब मैंने एक मेनू चयन पर क्लिक किया [उसके लिए अधिकृत] टोकन [ActionResult] ने मुझे लॉगिन स्क्रीन पर वापस भेजा।

यहाँ मेरा लॉगआउट कोड है:

        FormsAuthentication.SignOut();
        Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
        Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
        HttpCookie cookie = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (cookie != null)
        {
            cookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Add(cookie);
        }

हालांकि ब्राउज़र पर बैक फ़ंक्शन ने मुझे वापस ले लिया और सुरक्षित मेनू प्रदर्शित किया (मैं अभी भी उस पर काम कर रहा हूं) मैं ऐप में सुरक्षित कुछ भी करने में सक्षम नहीं था।

उम्मीद है की यह मदद करेगा


धन्यवाद। यह वह समाधान है जिसने मेरे लिए काम किया ( <deny users="?" />web.config में कोई ज़रूरत नहीं )
अलेक्सी

3

मैंने इस धागे में अधिकांश उत्तर देने की कोशिश की है, नसीब नहीं। इसके साथ समाप्त हुआ:

protected void btnLogout_Click(object sender, EventArgs e)
{
    FormsAuthentication.Initialize();
    var fat = new FormsAuthenticationTicket(1, "", DateTime.Now, DateTime.Now.AddMinutes(-30), false, string.Empty, FormsAuthentication.FormsCookiePath);
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
    FormsAuthentication.RedirectToLoginPage();
}

यहाँ पाया: http://forums.asp.net/t/1306526.aspx/1


3

यह उत्तर तकनीकी रूप से खोस्रो के समान है। पक्मानेश। मैं यह स्पष्ट करने के लिए पोस्ट कर रहा हूं कि उसका उत्तर इस धागे पर अन्य उत्तरों से कैसे भिन्न होता है, और किस मामले में इसका उपयोग किया जा सकता है।

सामान्य रूप से एक उपयोगकर्ता-सत्र खाली करने के लिए, कर रहा है

HttpContext.Session.Abandon();
FormsAuthentication.SignOut();

प्रभावी रूप से उपयोगकर्ता को लॉग आउट करेगा। हालाँकि , यदि उसी अनुरोध में आपको जांच करने की आवश्यकता है Request.isAuthenticated(जैसा कि अक्सर प्राधिकरण फ़िल्टर में हो सकता है, उदाहरण के लिए), तो आप पाएंगे कि

Request.isAuthenticated == true

यहां तक ​​कि आपने किया HttpContext.Session.Abandon()और उसके बाद भी FormsAuthentication.SignOut()

जो काम करता था वही कर रहा था

AuthenticationManager.SignOut();
HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);

वह प्रभावी रूप से सेट करता है Request.isAuthenticated = false


2

यह मेरे लिए तब होने लगा जब मैंने प्रमाणीकरण> फ़ॉर्म> पथ संपत्ति में सेट किया Web.config। उस समस्या को दूर करना और एक साधारण FormsAuthentication.SignOut();फिर से कुकी को हटा देना।


1

यह हो सकता है कि आप एक सबडोमेन (सब1.domain.com) से लॉग इन कर रहे हों और फिर एक अलग उपडोमेन (www.domain.com) से लॉगआउट करने की कोशिश कर रहे हों।


1

मुझे बस एक ही समस्या थी, जहां साइनऑट () प्रतीत होता है कि टिकट को ठीक से हटाने में विफल रहा। लेकिन केवल एक विशिष्ट मामले में, जहां कुछ अन्य तर्क एक पुनर्निर्देशन का कारण बने। जब मैंने इस दूसरे रीडायरेक्ट को हटा दिया (इसे एक त्रुटि संदेश के साथ बदल दिया), तो समस्या दूर हो गई।

समस्या यह रही होगी कि पृष्ठ गलत समय पर पुनर्निर्देशित हुआ, इसलिए प्रमाणीकरण को ट्रिगर नहीं किया गया।


1

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

Response.Redirect("url", false);

यह अपवाद को रोकता है और लगता है कि कुकी को क्लाइंट को ठीक से वापस भेजने की अनुमति है।


1

जब आप लॉग इन दबाते हैं तो एक सत्र चर भेजने की कोशिश करें और स्वागत पृष्ठ पर, पहले जांचें कि क्या यह सत्र पृष्ठ लोड या इनिट इवेंट में इस तरह से खाली है:

if(Session["UserID"] == null || Session["UserID"] == "")
{
    Response.Redirect("Login.aspx");
}

1

मेरे लिए, निम्नलिखित दृष्टिकोण काम करता है। मुझे लगता है कि अगर "FormsAuthentication.SignOut ()" कथन के बाद कोई त्रुटि है, तो SingOut काम नहीं करता है।

public ActionResult SignOut()
    {
        if (Request.IsAuthenticated)
        {
            FormsAuthentication.SignOut();

            return Redirect("~/");
        }
        return View();
     }

0

क्या आप IE का उपयोग करके इस व्यवहार का परीक्षण / देख रहे हैं? यह संभव है कि IE कैश से उन पृष्ठों की सेवा कर रहा है। यह IE के लिए यह कैश है फ्लश करने के लिए बहुत मुश्किल है, और इसलिए कई अवसरों पर, आप लॉग आउट करने के बाद भी, "सुरक्षित" पृष्ठों में से एक के url को टाइप करने से पहले कैश्ड सामग्री दिखाएगा।

(मैंने यह व्यवहार तब भी देखा है जब आप एक अलग उपयोगकर्ता के रूप में लॉग इन करते हैं, और IE आपके पेज के शीर्ष पर "वेलकम" बार दिखाता है, पुराने उपयोगकर्ता के उपयोगकर्ता नाम के साथ। आजकल, आमतौर पर एक रीलोड इसे अपडेट करेगा, लेकिन अगर यह लगातार है , यह अभी भी एक कैशिंग मुद्दा हो सकता है।)


0

सेशन.बांडन () करना और कुकी को नष्ट करना बहुत अच्छा काम करता है। मैं mvc3 का उपयोग कर रहा हूं और ऐसा लगता है कि समस्या तब होती है जब आप किसी संरक्षित पृष्ठ पर जाते हैं, लॉग आउट करते हैं, और अपने ब्राउज़र इतिहास के माध्यम से जाते हैं। बहुत बड़ी बात नहीं है लेकिन फिर भी यह कष्टप्रद है।

मेरे वेब ऐप पर लिंक के माध्यम से जाने की कोशिश करना सही तरीका है।

ब्राउज़र कैशिंग नहीं करने के लिए इसे सेट करना जाने का तरीका हो सकता है।


0

MVC के लिए यह मेरे लिए काम करता है:

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            return Redirect(FormsAuthentication.GetRedirectUrl(User.Identity.Name, true));
        }

0

मैं समस्या को समझने में मदद करने के लिए कुछ जानकारी जोड़ना चाहता था। प्रपत्र प्रमाणीकरण उपयोगकर्ता डेटा को कुकी में, या URL के क्वेरी स्ट्रिंग में संग्रहीत करने की अनुमति देता है। आपकी साइट का समर्थन करने वाला तरीका web.config फ़ाइल में कॉन्फ़िगर किया जा सकता है।

Microsoft के अनुसार :

SignOut विधि कुकी या URL से कुकी- URL के गलत होने पर फ़ॉर्म-प्रमाणीकरण टिकट जानकारी को हटा देती है

उसी समय, वे कहते हैं :

HttpCookieMode मूल्यों में से एक, जो इंगित करता है कि क्या कुकिंगलेस फॉर्म प्रमाणीकरण के लिए एप्लिकेशन कॉन्फ़िगर किया गया है। डिफ़ॉल्ट UseDeviceProfile है

अंत में, UseDeviceProfile के बारे में, वे कहते हैं :

यदि CookMMode गुण UseDeviceProfile पर सेट है, तो यदि कुकीज़ ब्राउजर पर वापस आ जाएगी , तो कुकीज़ की संपत्ति सही हो जाएगी। कुकीज़ मौजूदा कुकी का समर्थन करती है और कुकीज़ के साथ पुनर्निर्देशित; अन्यथा, CookiesSupported संपत्ति झूठी वापस आ जाएगी।

उपयोगकर्ता के ब्राउज़र पर निर्भर करते हुए, यह सब एक साथ जोड़ते हुए, डिफ़ॉल्ट कॉन्फ़िगरेशन का परिणाम हो सकता है ताकि कुकीज़ सकुशल हो , जिसका अर्थ है कि SignOut विधि कुकी से टिकट को साफ नहीं करती है। यह काउंटर-सहज ज्ञान युक्त लगता है और मुझे नहीं पता कि यह इस तरह से क्यों काम करता है - मुझे उम्मीद है कि साइनऑट वास्तव में किसी भी परिस्थिति में उपयोगकर्ता को साइन आउट करेगा।

अपने आप से साइनऑउट काम करने का एक तरीका यह है कि कुकी मोड को "UseCookies" में बदल दिया जाए (अर्थात कुकीज़ आवश्यक हैं) web.config फ़ाइल में:

<authentication mode="Forms">
  <forms loginUrl="~/Account/SignIn" cookieless="UseCookies"/>
</authentication>

मेरे परीक्षणों के अनुसार, ऐसा करने से आपकी साइट की कीमत पर साइनऑट काम खुद हो जाता है अब कुकीज़ को ठीक से काम करने की आवश्यकता होती है।


मुझे लगता है कि आप गलत पढ़ रहे हैं। SignOut () के बारे में, मुझे पूरा यकीन है कि उनका मतलब यह है कि अगर कूकीज से कुकी गलत है, तो यह URL से साफ हो जाएगा। यानी उन्हें लिखा जाना चाहिए था "साइनऑउट विधि, कुकी से फ़ॉर्म-प्रमाणीकरण टिकट की जानकारी को हटा देती है या, यदि कूपरशिप यूआरएल से गलत है, तो।"
ओस्कर बर्गग्रेन

-1

ज्ञात रहे कि WIF कुकीज़ को साफ करने के लिए ब्राउज़र को बताने से इंकार कर देता है यदि STS से wsignoutcleanup संदेश IIS से एप्लिकेशन के नाम के साथ url से मेल नहीं खाता है, और मेरा मतलब है SENSITIVE । WIF ग्रीन ओके चेक के साथ प्रतिक्रिया करता है, लेकिन होगा नहीं ब्राउज़र को कुकीज़ हटाने के लिए कमांड भेजेगा।

तो, आपको अपने यूआरएल के मामले की संवेदनशीलता पर ध्यान देने की आवश्यकता है।

उदाहरण के लिए, थिंकटेक्ट्योर आइडेंटिटी सर्वर एक कुकी में आने वाले आरपी के यूआरएल को बचाता है, लेकिन यह उन सभी को कम केस बनाता है। WIF को निचले मामले में wsignoutcleanup संदेश प्राप्त होगा और यह IIS में एप्लिकेशन नाम के साथ तुलना करेगा। यदि यह मेल नहीं खाता है, तो यह कोई कुकीज़ नहीं हटाता है, लेकिन ब्राउज़र को ओके रिपोर्ट करेगा। इसलिए, इस आइडेंटिटी सर्वर के लिए मुझे ऐसी समस्याओं से बचने के लिए web.config और IIS के सभी एप्लिकेशन नामों को निचले मामले में सभी यूआरएल लिखने की जरूरत थी।

यदि आप STS के उपडोमेन के बाहर अनुप्रयोग हैं, तो भी ब्राउज़र में थर्ड पार्टी कुकी की अनुमति देना न भूलें, अन्यथा WIF उसे बताता है तो भी ब्राउज़र कुकीज़ को नहीं हटाएगा।


1
WIF? एसटीएस? ThinkTecture आइडेंटिटी सर्वर? ये सभी बातें क्या हैं, और वे इस प्रश्न से कैसे संबंधित हैं?
ओस्कर बर्गग्रेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.