2014-12-08 13 views
17

प्रदान करके वेबपी से लंबे भालू टोकन से निपटना मैं दावा प्रमाणीकरण का उपयोग कर एएसपी.नेट वेबएपी 2 का उपयोग कर एक वेब एपीआई बना रहा हूं, और मेरे उपयोगकर्ताओं के पास बड़ी संख्या में दावे हो सकते हैं। बड़ी संख्या में दावों के साथ भालू टोकन बहुत तेजी से बढ़ता है, इसलिए मैं बहुत कम भालू टोकन लौटने का एक तरीका खोजने का प्रयास कर रहा हूं।सरोगेट टोकन

अब तक मुझे पता चला है कि मैं OAuth के विकल्प के लिए एक IAuthenticationTokenProviderOAuthAuthorizationServerOptions.AccessTokenProvider संपत्ति प्रदान कर सकते हैं:

OAuthOptions = new OAuthAuthorizationServerOptions 
{ 
    TokenEndpointPath = new PathString("/Token"), 
    Provider = new ApplicationOAuthProvider(PublicClientId), 
    AccessTokenExpireTimeSpan = TimeSpan.FromHours(12), 
    AccessTokenProvider = new GuidProvider() // <-- here 
}; 

और यह मुझे AuthenticationTicket रोकना और इसे दूर भी छिपा सकते, सरल कुछ और इसकी जगह का मौका देता - एक हैश गाइड के नीचे मेरे उदाहरण में। (नोट: फिलहाल इस वर्ग के बस मेरी सत्र के साथ एक ConcurrentDictionary<string,AuthenticationTicket> रखती है - एक वास्तविक दुनिया उदाहरण में मैं कुछ स्थायी संग्रह में सत्र की दुकान करने का इरादा)

public class GuidProvider : IAuthenticationTokenProvider 
{ 
    private static ConcurrentDictionary<string, AuthenticationTicket> tokens 
     = new ConcurrentDictionary<string, AuthenticationTicket>(); 

    public void Create(AuthenticationTokenCreateContext context) 
    { 
     throw new NotImplementedException(); 
    } 

    public async System.Threading.Tasks.Task CreateAsync(AuthenticationTokenCreateContext context) 
    { 
     var guid = Guid.NewGuid().ToString(); 

     var ticket = Crypto.Hash(guid); 

     tokens.TryAdd(ticket, context.Ticket); 

     context.SetToken(ticket); 
    } 

    public void Receive(AuthenticationTokenReceiveContext context) 
    { 
     throw new NotImplementedException(); 
    } 

    public async System.Threading.Tasks.Task ReceiveAsync(AuthenticationTokenReceiveContext context) 
    { 
     AuthenticationTicket ticket; 

     if (tokens.TryGetValue(context.Token, out ticket)) 
     { 
      if (ticket.Properties.ExpiresUtc.Value < DateTime.UtcNow) 
      { 
       tokens.TryRemove(context.Token, out ticket); 
      } 
      context.SetTicket(ticket); 
     } 
    } 
} 

तो मेरे सवालों का:

  • क्या यह मेरे लंबे दावों से उत्पन्न टोकन के स्थान पर सरोगेट कुंजी प्रदान करने का एक उचित (और सुरक्षित!) तरीका है?
  • क्या शायद एक बेहतर/आसान जगह है जहां मुझे इसे वेबपी/ओथ स्टैक के भीतर करना चाहिए? एक ताज़ा टोकन के माध्यम से सिवाय इसके कि वे एक प्रतीत -

नोट करने के लिए एक और बात है कि मैं ताज़ा टोकन का समर्थन करना चाहते हैं, और वास्तव में उपरोक्त उदाहरण जो ताज़ा टोकन के लिए तंत्र की इस तरह का उपयोग उदाहरण से खींचा गया था है उपयोग करें, इसलिए ReceiveAsync विधि आमतौर पर ConcurrentDictionary से दी गई ताज़ा टोकन को हटा देगी, मुझे पूरा यकीन नहीं है कि मैं क्यों समझता हूं?

+0

यह दृष्टिकोण ठीक है यदि आपका ग्राहक इस प्राधिकरण को फिर से भेज देगा, तो यदि आप एक्सेस टोकन को संभालने के लिए इस संपर्क का उपयोग करते हैं तो ओएथ 2 में जेट होगा, सही विकल्प नहीं होगा – Saravanan

+0

क्योंकि प्राधिकरण को अलग किया जा सकता है ग्राहक ऐप और आप सरोगेट टोकन से दावा का अनुमान नहीं लगा सकते हैं। – Saravanan

+0

@ jamiec ने जेडब्ल्यूटी का उपयोग करके मेरा जवाब दावे से भरे अपने एक्सेस टोकन को कम करने में मदद की? –

उत्तर

7

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

मेरा सुझाव है कि आप JSON वेब टोकन जेडब्ल्यूटी बजाय डिफ़ॉल्ट वाहक पहुंच टोकन प्रारूप का उपयोग करते हैं, यह आप अपने कस्टम नीचे कोड के रूप में OAuthAuthorizationServerOptions में संपत्ति Provider में पहुँच टोकन प्रारूप CustomOAuthProvider लागू की जरूरत है ऐसा करने के लिए:

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
     { 
      //For Dev enviroment only (on production should be AllowInsecureHttp = false) 
      AllowInsecureHttp = true, 
      TokenEndpointPath = new PathString("/oauth2/token"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30), 
      Provider = new CustomOAuthProvider(), 
      AccessTokenFormat = new CustomJwtFormat("http://jwtauthzsrv.azurewebsites.net") 
     }; 

मैंने देखा है कि जेडब्ल्यूटी टोकन को और अधिक दावों को जोड़ने से डिफ़ॉल्ट आकार टोकन प्रारूप के मामले में नाटकीय रूप से इसका आकार नहीं बढ़ेगा।

प्रत्येक के अंदर विभिन्न दावों के साथ 2 जेडब्ल्यूटी के नमूने के नीचे, दूसरा वाला केवल 50 वर्णों से पहले बड़ा होता है।

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6InRhaXNlZXIiLCJzdWIiOiJ0YWlzZWVyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciJdLCJpc3MiOiJodHRwOi8vand0YXV0aHpzcnYuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOiIwOTkxNTNjMjYyNTE0OWJjOGVjYjNlODVlMDNmMDAyMiIsImV4cCI6MTQxODY0NzMyNywibmJmIjoxNDE4NjQ1NTI3fQ.vH9XPtjtAv2-6SwlyX4fKNJfm5ZTVHd_9a3bRgkA_LI 

दूसरा जेडब्ल्यूटी (अधिक दावे): मैं तुम्हें हर एक jwt.io पहले जेडब्ल्यूटी का उपयोग करने का इनकोडिंग सामग्री की जांच करने के लिए सलाह देते हैं

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6InRhaXNlZXIiLCJzdWIiOiJ0YWlzZWVyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciIsIlN1cGVydmlzb3IxIiwiU3VwZXJ2aXNvcjIiLCJTdXBlcnZpc29yMyJdLCJpc3MiOiJodHRwOi8vand0YXV0aHpzcnYuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOiIwOTkxNTNjMjYyNTE0OWJjOGVjYjNlODVlMDNmMDAyMiIsImV4cCI6MTQxODY0NzQ1NiwibmJmIjoxNDE4NjQ1NjU2fQ.TFEGDtz1RN8VmCQu7JH4Iug0B8UlWDLVrIlvc-7IK3E 

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

मैं कैसे एक लाइव डेमो एपीआई और source code on GIthub के साथ ASP.NET वेब एपीआई में जेडब्ल्यूटी टोकन का उपयोग करने के बारे में bitoftech.net पर detailed blog post लिखा है, इसकी जांच करें और यदि आप और अधिक मदद की जरूरत है मुझे पता है के लिए स्वतंत्र महसूस।

शुभकामनाएं!

+0

आप जेडब्ल्यूटी के काम को refresh_tokens के साथ उल्लेख करते हैं। क्या आप विस्तार से समझा सकते हैं? अभी, मेरे पास एक कार्यान्वयन है जो मुझे मेरे एक्सेस_टोकन के रूप में एक जेडब्ल्यूटी देगा और उसी प्रतिक्रिया में, इसमें एक बहुत छोटा टोकन (एक guid) शामिल है जो मेरा refresh_token है। क्या यह सही प्रक्रिया है या refresh_token भी लंबे जीवनकाल के साथ एक जेडब्ल्यूटी होना चाहिए? –

+0

कोई ताज़ा टोकन सिर्फ आपके डेटाबेस में संग्रहीत संरक्षित टिकट के लिए पहचानकर्ता नहीं है, आप इस पहचानकर्ता को grant_type = refresh_token के साथ प्रस्तुत करते हैं और यदि यह मान्य है (डीबी से हटाया नहीं गया है और समाप्त नहीं हुआ है) तो आपको नया जेडब्ल्यूटी एक्सेस टोकन प्राप्त होगा, उम्मीद है कि यह स्पष्ट। –

+0

यह समझ में आता है। धन्यवाद। –

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