2014-11-06 11 views
18

हम SimpleAuthorizationServerProvider के साथ एक वेब एपी प्रोजेक्ट में एएसपी.NET पहचान का उपयोग करते हैं, हम क्लाइंट से आने वाले प्रत्येक अनुरोध को अधिकृत करने के लिए ओथ-टोकन का उपयोग करते हैं। (टोकन के पास टाइमपैन है और समाप्त हो जाता है, हम रीफ्रेश टोकन का उपयोग नहीं करते हैं।)पासवर्ड बदलते समय OAuth टोकन को कैसे अमान्य करें?

जब उपयोगकर्ता अपना पासवर्ड बदलते हैं, तो संभवतः अन्य टोकरों पर उनके टोकन को अमान्य करना चाहूंगा। क्या स्पष्ट रूप से ऐसा करने का कोई तरीका है? मैंने प्रयोग किया और देखा कि मौजूदा टोकन पासवर्ड बदलने के बाद किसी भी समस्या के बिना काम करते हैं, जिसे रोका जाना चाहिए।

मैंने पासवर्ड हैश, या ओथ टोकन में हैश के हिस्से को दावा के रूप में डालने के बारे में सोचा और यह सत्यापित किया कि हमारे व्युत्पन्न AuthorizeAttribute फ़िल्टर की OnAuthorization विधि में यह सत्यापित है।
क्या समस्या को हल करने का यह सही तरीका होगा?

+0

ओएथ के साथ बिंदु का हिस्सा नहीं है कि यह पासवर्ड परिवर्तनों पर स्वतंत्र है? जब वे पासवर्ड बदलते हैं तो अपने प्रमाणीकरण सर्वर से टोकन को न हटाएं, फिर यदि वे कोशिश करते हैं और अन्य उपकरणों पर इसका उपयोग करते हैं तो यह काम नहीं करेगा। – DaImTo

+0

"क्यों न केवल अपने प्रमाणीकरण सर्वर से टोकन हटाएं": क्या यह एएसपी.NET पहचान के साथ संभव है? मैंने सोचा कि टोकन स्वयं निहित हैं, इसलिए उन्हें किसी भी वेब-सर्वर उदाहरण पर उपयोग किया जा सकता है, इस प्रकार हमारे पास प्रमाणीकरण सर्वर नहीं है। –

+0

यदि यह सच है तो ऐसा लगता है कि मुझे "एएसपी.नेट पहचान" पर एक ताज़ा करने की आवश्यकता है। माफ़ कीजिये। – DaImTo

उत्तर

12

मैं पासवर्ड के हैश को दावे के रूप में डालने की अनुशंसा नहीं करता हूं, और मेरा मानना ​​है कि पासवर्ड बदलते समय टोकन को अमान्य करने का कोई सीधा तरीका नहीं है।

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

पासवर्ड बदल जाने के बाद आप इस संसाधन मालिक (उपयोगकर्ता) के लिए इस टोकन पहचानकर्ता रिकॉर्ड को हटा दें और अगली बार क्लाइंट से भेजे गए टोकन को अस्वीकार कर दिया जाएगा क्योंकि इस टोकन पहचानकर्ता और संसाधन स्वामी के रिकॉर्ड को हटा दिया गया है।

+1

यह लागू करने और ठीक से काम करने के लिए आसान था। धन्यवाद! –

+2

खुशी है कि यह सहायक था।यदि आप चाहते हैं कि आप इसे लागू करने के लिए बनाए गए कोड का हिस्सा क्यों साझा नहीं करते हैं, तो मुझे यकीन है कि यह दूसरों के लिए उपयोगी होगा :) –

+2

मैंने कुछ कोड विवरण पोस्ट किए हैं। –

12

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

इस टिकट को दावे के हिस्से के रूप में टोकन के हिस्से के रूप में ग्राहक को भेजना होगा। यह OAuthAuthorizationServerProvider-कार्यान्वयन के GrantResourceOwnerCredentials विधि में निम्न कोड के साथ प्राप्त किया जा सकता है।

identity.AddClaim(new Claim("PasswordTokenClaim", user.LatestPasswordStamp.ToString())); 

यह डाक टिकट हर अनुरोध में क्लाइंट से सर्वर तक भेजे जाने के लिए जा रहा है, और यह सत्यापित किया गया है कि टिकट डेटाबेस में नहीं बदला गया है। यदि ऐसा होता है, तो इसका मतलब है कि उपयोगकर्ता ने अपना पासवर्ड बदल दिया, संभवतः किसी अन्य डिवाइस से। सत्यापन इस तरह हमारे कस्टम प्राधिकरण फ़िल्टर में किया जाता है।

public class AuthorizeAndCheckStampAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     var claimsIdentity = actionContext.RequestContext.Principal.Identity as ClaimsIdentity; 
     if(claimsIdentity == null) 
     { 
      this.HandleUnauthorizedRequest(actionContext); 
     } 

     // Check if the password has been changed. If it was, this token should be not accepted any more. 
     // We generate a GUID stamp upon registration and every password change, and put it in every token issued. 
     var passwordTokenClaim = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "PasswordTokenClaim"); 

     if(passwordTokenClaim == null) 
     { 
      // There was no stamp in the token. 
      this.HandleUnauthorizedRequest(actionContext); 
     } 
     else 
     { 
      MyContext ctx = (MyContext)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(MyContext)); 

      var userName = claimsIdentity.Claims.First(c => c.Type == ClaimTypes.Name).Value; 

      if(ctx.Users.First(u => u.UserName == userName).LatestPasswordStamp.ToString() != passwordTokenClaim.Value) 
      { 
       // The stamp has been changed in the DB. 
       this.HandleUnauthorizedRequest(actionContext); 
      } 
     } 

     base.OnAuthorization(actionContext); 
    } 
} 

इस तरह अगर यह एक टोकन जो पहले पासवर्ड बदल दिया गया जारी किया गया था के साथ खुद को अधिकृत करने के लिए कोशिश करता है ग्राहक प्रमाणीकरण त्रुटि हो जाता है।

+2

अच्छा समाधान, क्या कोई आधिकारिक तरीका नहीं है जिसे ओएथ ने सुझाव दिया है कि हम ऐसे मामलों को संभालेंगे? मेरा मतलब है कि यह पूरी प्रमाणीकरण योजना में एक गंभीर छेद प्रतीत होता है यदि पासवर्ड बदल दिए जाने के बाद भी सभी डिवाइस एक्सेस कर सकते हैं। – Zapnologica

+1

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

+0

क्या मेरा प्रस्तावित समाधान आपके अनुभव के अनुसार काम करेगा? http://stackoverflow.com/questions/29534111/oauth-access-and-refresh-token-control-on-password-change – Zapnologica

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