2016-04-22 8 views
11

मैं ओ # आईएसपी एमवीसी वेब ऐप में ओपनआईडी कनेक्ट प्रमाणीकरण (Microsoft.Owin.Security.OpenIdConnect) के साथ ओविन/ओथ का उपयोग कर रहा हूं। माइक्रोसॉफ्ट खाते के साथ एसएसओ लॉगिन मूल रूप से काम करता है, लेकिन समय-समय पर मुझे ब्राउज़र पर एक त्रुटि पृष्ठ मिल रहा है जो Bad Request - Request Too Long कहता है।बहुत सारी कुकीज OpenIdConnect.nonce त्रुटि पृष्ठ "खराब अनुरोध - अनुरोध बहुत लंबा"

मुझे पता चला कि यह त्रुटि बहुत सारी कुकीज़ के कारण हुई है। कुकीज़ को हटाने में कुछ समय लगता है, लेकिन थोड़ी देर के बाद समस्या वापस आती है।

कुकीज़ कि समस्या का कारण OpenId ढांचे से स्थापित कर रहे हैं, इसलिए वहाँ OpenIdConnect.nonce.9oEtF53WxOi2uAw....... जैसे नामों वाली कुकी के दर्जनों रहे हैं।

यह एसपीए आवेदन नहीं है, लेकिन कुछ भागों ajax कॉल के साथ समय-समय पर ताजा कर रहे हैं।

उत्तर

25

यह पता चला कि मूल कारण अजाक्स कॉल था।

समस्याग्रस्त प्रवाह

1) OAuth कुकी कुछ समय

2) समय सीमा समाप्ति सामान्य रूप से पुनर्निर्देशन login.microsoft.com करने के लिए पृष्ठ कुकी ताज़ा करने के लिए कारण बनता है के बाद समाप्त हो गया था। इस चरण में ओथ फ्रेमवर्क नईnonce प्रतिक्रिया में कुकी (हर बार) जोड़ता है!

3) लेकिन अजाक्स login.microsoft.com के डोमेन (क्रॉस-डोमेन के बाहर पुनर्निर्देशन संभाल नहीं है)। लेकिन कुकी पहले ही पृष्ठ पर संलग्न थी।

4) अगला समय-समय पर अजाक्स कॉल 'अस्थायी रूप से कुकी से एक तेजी से वृद्धि के कारण प्रवाह को दोहराया।

समाधान

मैं "Owin OpenId" ढांचे सेटअप अजाक्स को संभालने के लिए कोड का विस्तार करने के लिए किया था अलग ढंग से कहता है - पुनर्निर्देशन को रोकने और कुकीज़ भेजने से रोकने के।

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
    app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

    app.UseOpenIdConnectAuthentication(
     new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = clientId, 
      Authority = authority, 
      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       RedirectToIdentityProvider = ctx => 
       { 
        bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest"); 

        if (isAjaxRequest) 
        { 
         ctx.Response.Headers.Remove("Set-Cookie"); 
         ctx.State = NotificationResultState.HandledResponse; 
        } 

        return Task.FromResult(0); 
       } 
      } 
     }); 
} 

अजाक्स फोन करने वाले भी समायोजित करने की 401 कोड का पता लगाने और पूर्ण पृष्ठ ताज़ा (जो माइक्रोसॉफ्ट अधिकार के लिए एक त्वरित रीडायरेक्ट कारण) प्रदर्शन करने के लिए किया था।

+1

धन्यवाद। मुझे एक समान समस्या थी और इससे इसे हल करने में मदद मिली। – Namrehs

+0

यह क्रोम कुकीज़ को साफ़ करने के बाद भी मेरी समस्या को हल करने के लिए दिखाई दिया। विडंबना यह है कि एमएस के बहादुर नए ब्राउज़र एज .... आईई के रूप में बहुत सी असंगतताएं और प्रदर्शन समस्याएं हैं, इसलिए मैं अब क्रोम का उपयोग करने के लिए वापस आ गया हूं। –

+0

मेरी समस्या भी हल की। धन्यवाद –

0

मेरे मामले समस्या में जिस क्रम में मैं Startup.cs अंदर आवेदन को विन्यस्त किया गया था।

स्वयं को अनुस्मारक - हमेशा प्रमाणीकरण को कॉन्फ़िगर करें!

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = _clientId, 
       ClientSecret = _clientSecret, 
       Authority = _authority, 
       RedirectUri = _redirectUri 
      }); 

     // configure the rest of the application... 
    } 
संबंधित मुद्दे