2015-02-26 12 views
10

के बाद बनाए रखा नहीं है मैं एमवीसी 5.2 के लिए नवीनतम नमूना कोड का उपयोग कर रहा हूं Asp.Identity और दो फैक्टर प्रमाणीकरण के साथ।एएसपी.Net 2FA के साथ पहचान - याद रखें ब्राउज़र कुकी को

2FA सक्षम होने पर, जब उपयोगकर्ता लॉग इन करता है, तो कोड (फ़ोन या ईमेल द्वारा भेजा गया) के लिए संकेत मिलता है और उनके पास "ब्राउज़र याद रखें" का विकल्प होता है - ताकि वे फिर से कोड के लिए न पूछें ब्राउज़र।

यह VerifyCode कार्रवाई

var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent: model.RememberMe, rememberBrowser: model.RememberBrowser); 

ध्यान दें कि model.RememberMe डिफ़ॉल्ट टेम्पलेट्स में नहीं किया जाता है तो यह गलत है में नियंत्रित किया जाता है।

मुझे लगता है जब मैं इस .AspNet.TwoFactorRememberBrowser सेट हो जाता है कि करते हैं, सत्र अंत को समाप्त हो रहा (इसलिए यह ब्राउज़र को याद नहीं करता है)

अब अगर मैं isPersistent = true निर्धारित करते हैं, .AspNet.TwoFactorRememberBrowser 30 दिनों की एक समय समाप्ति जो महान है हो जाता है, लेकिन .AspNet.ApplicationCookie को 30 दिन की समाप्ति भी मिलती है - जिसका अर्थ यह है कि जब मैं ब्राउज़र बंद करता हूं और फिर से खोलता हूं, तो मैं स्वचालित रूप से लॉग इन हूं।

मुझे यह चाहिए कि यह मेरा लॉगिन जारी न रहे, लेकिन यह होगा 2 एफए कोड को याद रखने की मेरी पसंद जारी रखें। यानी उपयोगकर्ता को हमेशा लॉगिन करना होगा, लेकिन उन्हें 2fa कोड के लिए नहीं पूछा जाना चाहिए यदि वे इसे पहले ही सहेज चुके हैं।

क्या किसी और ने इसे देखा है, या क्या मुझे कुछ याद आ रहा है?

+0

क्या आपको इसका समाधान मिला? – karol

+0

नहीं, मैंने समय के लिए छोड़ा, लेकिन आश्चर्यचकित नहीं हुआ कि किसी ने कभी भी एक ही समस्या का अनुभव नहीं किया है। मैं जल्द ही इसे वापस जाने का इरादा रखता हूं। क्या आपको एक ही समस्या मिली? –

+0

मुझे एक ही समस्या मिली :(मैंने यहां पाया गया नमूना प्रोजेक्ट के साथ भी परीक्षण किया और उसी परिणाम प्राप्त किए (http://www.asp.net/mvc/overview/security/aspnet-mvc-5-app-with- एसएमएस-और-ईमेल-दो-कारक-प्रमाणीकरण) और लेखक के लिए एक टिप्पणी छोड़ दी। अगर मैं जवाब देता हूं और कोई अंतर्दृष्टि प्रदान करता हूं तो मैं यहां पोस्ट करना सुनिश्चित कर दूंगा। – karol

उत्तर

2

यह अभी भी पहचान 2.2.1 में एक मुद्दा हो गया लगता है (यह Asp.Net पहचान 3.0 में ठीक किया जा सकता है - लेकिन यह है कि वर्तमान में पूर्व में जारी की है और नेट ढांचे के बाद के संस्करण की आवश्यकता है कि 4.5)

आसपास के आसपास के काम के लिए ठीक लगता है: कुकी साइनइनमेनर पर सेट हो रही है। दो मान्यताओं के साथ WinFactorSignInAsync, इसलिए VerifyCode कार्रवाई की सफलता पर, मैं कुकी को लगातार बनाए रखने के लिए रीसेट करता हूं और इसे समाप्त होने वाली समाप्ति तिथि देता हूं (इस मामले में मैंने इसे एक वर्ष में सेट किया)

public async Task<ActionResult> VerifyCode(VerifyCodeViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     }   var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent: model.RememberMe, rememberBrowser: model.RememberBrowser); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       // if we remember the browser, we need to adjsut the expiry date as persisted above 
       // Also set the expiry date for the .AspNet.ApplicationCookie 
       if (model.RememberBrowser) 
       { 
        var user = await UserManager.FindByIdAsync(await SignInManager.GetVerifiedUserIdAsync()); 
        var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(user.Id); 
        AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddDays(365) }, rememberBrowserIdentity); 
       } 

       return RedirectToLocal(model.ReturnUrl); 
+1

यह बिल्कुल सही नहीं है। यह AspNet.TwoFactorRememberBrowser कुकी वर्ष की समाप्ति तिथि देता है, लेकिन यह एक ही समाप्ति दिन के साथ .spnet.AplicationCookie भी सेट करता है - जिसे मैं नहीं चाहता हालांकि, जब उपयोगकर्ता बाद में लॉग आउट करता है और फिर से वापस आ जाता है, तो .AspNet.AplicationCookie को एक सत्र कुकी (जिसे मैं चाहता हूं) पर रीसेट कर देता है। –

+2

ऊपर दिए गए कोड के बाद उपयोगकर्ता को फिर से लॉग आउट करना है सत्यापित किया गया है - आदर्श नहीं - लेकिन यह वांछित परिणाम प्राप्त होता है –

+1

एक और कामकाज: यदि उपयोगकर्ता ने सही ढंग से कोड सत्यापित किया है और "याद रखें ब्राउज़र ", अगले अनुरोध पर मैन्युअल रूप से दोFactorRememberBrowser कुकी समाप्ति दिनांक संशोधित करें। मैं इसे Application_PostAuthenticateRequest के अंदर करता हूं। यह थोड़ी बदसूरत है, लेकिन अब तक मेरे लिए अच्छा काम किया है। – karol

8

ऐसा लगता है कि यह कोड देसी नहीं था एक ही अनुरोध/प्रतिक्रिया में एक से अधिक पहचान कुकी सेट करने के लिए तैयार किया गया क्योंकि ओविन कुकी हैंडलर वही प्रमाणीकरणप्रॉपर्टीज साझा करना समाप्त कर देते हैं। ऐसा इसलिए है क्योंकि प्रमाणीकरण ResponseGrant एक एकल प्रिंसिपल है, लेकिन प्रिंसिपल में कई पहचान हो सकती है।

आप में फेरबदल और फिर ResponseSignIn और ResponseSignedIn घटनाओं 2FA कुकी प्रदाता के लिए विशिष्ट में AuthenticationProperties बहाल करके इस बग वैकल्पिक हल कर सकते हैं:

 //Don't use this. 
     //app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 

     //Set the 2FA cookie expiration and persistence directly 
     //ExpireTimeSpan and SlidingExpiration should match the Asp.Net Identity cookie setting 
     app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      AuthenticationType = DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie, 
      AuthenticationMode = AuthenticationMode.Passive, 
      CookieName = DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie, 
      ExpireTimeSpan = TimeSpan.FromHours(2), 
      SlidingExpiration = true, 
      Provider = new CookieAuthenticationProvider 
      { 
       OnResponseSignIn = ctx => 
       { 
        ctx.OwinContext.Set("auth-prop-expires", ctx.Properties.ExpiresUtc); 
        ctx.OwinContext.Set("auth-prop-persist", ctx.Properties.IsPersistent); 
        var issued = ctx.Properties.IssuedUtc ?? DateTimeOffset.UtcNow; 
        ctx.Properties.ExpiresUtc = issued.AddDays(14); 
        ctx.Properties.IsPersistent = true; 
       }, 
       OnResponseSignedIn = ctx => 
       { 
        ctx.Properties.ExpiresUtc = ctx.OwinContext.Get<DateTimeOffset?>("auth-prop-expires"); 
        ctx.Properties.IsPersistent = ctx.OwinContext.Get<bool>("auth-prop-persist"); 
       } 
      } 
     }); 

ही ExpireTimeSpan और SldingExpiration आपका मुख्य Asp के रूप में स्थापित करना सुनिश्चित करें। उन सेटिंग्स को संरक्षित करने के लिए नेट पहचान कुकी (क्योंकि वे प्रमाणीकरण रीस्पॉन्सगेंट में विलय हो जाते हैं)।

+0

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

+0

बस बैरी के जवाब में जोड़ने के लिए, मैंने पहचान के कोड में कुछ जांच की और समस्या वहां प्रतीत नहीं होती है। ऐसा लगता है कि यह माइक्रोसॉफ्ट.ऑविन.सुरिटी असेंबली में प्रमाणीकरण प्रबंधक में है। साइनइन विधि जो बैरी जैसे प्रमाणीकरण रीस्पॉन्सगेंट में एक ही सेटिंग्स के साथ दोनों कुकीज़ सेट करने का प्रयास करती है। – AbeyMarquez

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