2011-11-25 5 views
10

इस तथ्य के बावजूद कि मैं थोड़ी देर के लिए यहां रहा हूं, यह एसओ पर मेरा पहला सवाल है, इसलिए कृपया मेरे साथ सौम्य रहें।क्या बेस कंट्रोलर एएसपी.नेट एमवीसी 3 में यह कस्टम प्रधानाचार्य बहुत अक्षम है?

मैं ASP.NET MVC 3 का उपयोग कर रहा हूं और मैं एक कस्टम Principal बनाना चाहता हूं, इसलिए मैं मानक उपयोगकर्ता की तुलना में वर्तमान उपयोगकर्ता के बारे में थोड़ी अधिक जानकारी स्टोर कर सकता हूं, इस प्रकार डेटाबेस को अक्सर नहीं जाना पड़ता है। यह काफी मानक सामान है जो मैं कर रहा हूं। आइए पहले उदाहरण में ईमेल पता और उपयोगकर्ता आईडी कहें।

मैंने ऑब्जेक्ट को कैश में स्टोर करने का निर्णय लिया है क्योंकि मुझे पता है कि इसे सत्र में संग्रहीत करने की सलाह नहीं दी जाती है।

मैं भी User ऑब्जेक्ट कास्टिंग रखना नहीं चाहता, इसलिए मैं नियंत्रक में User ऑब्जेक्ट को ओवरराइड करना चाहता था। तो मैं बस User.UserId जा सकता हूं और कुछ की गारंटी हो सकता हूं।

तो मैं इस तरह एक कस्टम प्रिंसिपल बनाया:

public class MyPrincipal : IPrincipal 
{ 
    public MyPrincipal(IIdentity ident, List<string> roles, string email, Guid userId) 
    { 
     this._identity = ident; 
     this._roles = roles; 
     this._email = email; 
     this._userId = userId; 
    } 

    IIdentity _identity; 

    public IIdentity Identity 
    { 
     get { return _identity; } 
    } 

    private List<string> _roles; 

    public bool IsInRole(string role) 
    { 
     return _roles.Contains(role); 
    } 

    private string _email; 

    public string Email 
    { 
     get { return _email; } 
    } 

    private Guid _userId; 

    public Guid UserId 
    { 
     get { return _userId; } 
    } 
} 

और मैं इस तरह की एक बेस नियंत्रक है:

public class BaseController : Controller 
    { 
     protected virtual new MyPrincipal User 
     { 
      get 
      { 
       if (base.User is MyPrincipal) 
       { 
        return base.User as MyPrincipal; 
       } 
       else 
       { 
        return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty); 
       } 
      } 
     } 

     protected override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (User != null) 
      { 
       if (User.Identity.IsAuthenticated) 
       { 
        if (User.Identity is FormsIdentity) 
        { 
         FormsIdentity id = base.User.Identity as FormsIdentity; 
         MyPrincipal principal = (MyPrincipal)filterContext.HttpContext.Cache.Get(id.Name); 
         if (principal == null) 
         { 
          MembershipUser user = Membership.GetUser(); 

          // Create and populate your Principal object with the needed data and Roles. 
          principal = new MyPrincipal(id, Roles.GetRolesForUser(id.Name).ToList(), user.Email, (Guid)user.ProviderUserKey); 
          filterContext.HttpContext.Cache.Add(
          id.Name, 
          principal, 
          null, 
          System.Web.Caching.Cache.NoAbsoluteExpiration, 
          new System.TimeSpan(0, 30, 0), 
          System.Web.Caching.CacheItemPriority.Default, 
          null); 
         } 
         filterContext.HttpContext.User = principal; 
         System.Threading.Thread.CurrentPrincipal = principal; 
         base.OnAuthorization(filterContext); 
        } 
       } 
      } 
     } 
    } 

आप एक नजर है, तो आप जल्दी से एहसास होगा उपयोगकर्ता है कि अगर में लॉग इन नहीं किया गयाUser ऑब्जेक्ट पर कॉल करें इस कोड को कोड के माध्यम से चलाने के लिए होगा:

return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty); 

और यह मेरे लिए बहुत अक्षम है, हालांकि यह केवल गायब सामान के लिए खाली वस्तुओं को बना रहा है।

यह ठीक काम करता है।

तो मुझे लगता है कि मैं जानना चाहता हूं कि यह वास्तव में ठीक है या नहीं और मुझे प्रदर्शन और दक्षता के बारे में इतना गुदा होना बंद करना चाहिए, या यदि मेरे डर सही हैं, तो इस मामले में मुझे इसके बजाय क्या करना चाहिए? [कृपया यह न कहें "जीवन प्राप्त करना, दोस्त!"]

+4

मत भूलना [नुथ] (http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize) ... "समय से पहले अनुकूलन सब बुराई की जड़ है।" यही कहना है, क्या आपने वास्तव में प्रदर्शन के मुद्दों को देखा है? –

+0

+1 अच्छा है। नहीं मैंने नहीं किया है।लेकिन बात यह है कि जब तक मैंने कोड की उस ग़लत रेखा को नहीं देखा, तब तक मैं इसे सब काम करने में बहुत स्मार्ट महसूस कर रहा था! वाह! मैं वास्तव में गुदा हूँ! मुझे लगता है कि बीबीसी माइक्रो पर कोडिंग शुरू करने की बात आती है, जहां घड़ी चक्र कुछ और बहुत दूर थे ... –

उत्तर

6

नहीं - इस कोड के साथ प्रदर्शन स्टैंड बिंदु से विशेष रूप से कुछ भी गलत नहीं है। ऑब्जेक्ट की पूरी तरह से एएसपी.NET में बैक एंड पर बना रही है, आपकी एकल ऑब्जेक्ट बाल्टी में एक बूंद है। चूंकि वर्ग तात्कालिकता बेहद तेज़ है, इसलिए मैं इसके बारे में चिंतित नहीं हूं।

आप यहां सत्रों को क्यों अनदेखा कर रहे हैं? सत्र की जानकारी की समाप्ति तिथियां नहीं होती हैं, इसलिए दृश्यों के पीछे कोई अतिरिक्त जांच नहीं होती है। जब तक आप proc सत्र सर्वर से बाहर का उपयोग नहीं कर रहे हैं, तब तक आपके ऑब्जेक्ट का कोई क्रमिकरण नहीं है (कैश के साथ कोई भी नहीं)। कैश प्रत्येक उपयोगकर्ता के लिए है - इसलिए आप गलत प्रिंसिपल लौटने वाले कोड त्रुटि की एक मौका (हालांकि मामूली) सही है, जहां प्रति उपयोगकर्ता कैश होता है - इसका जोखिम नहीं चलता है।

आप इस वहाँ सभी अनुरोधों के लिए उपलब्ध चाहते हैं (न सिर्फ MVC आधारित) मैं होगा इस पोस्ट Application_PostAuthenticateRequest

+0

+1 धन्यवाद एडम। सुरक्षा विचार के अलावा, कोई विशेष कारण नहीं है कि मैं सत्र को अनदेखा कर रहा हूं। मैंने जानबूझकर इसे 'Application_PostAuthenticateRequest' में शामिल नहीं किया है क्योंकि मुझे लगता है कि वहां कोड को सीएसएस, छवियों, जावास्क्रिप्ट आदि जैसी चीजों के अनुरोधों के लिए चलाया जाएगा जबकि मेरे कोड के साथ यह नहीं होगा। क्या वह सही है? किसी भी छवि को संरक्षित करने की आवश्यकता है जिसे एमवीसी 'फाइलकंटेंट रीसेट' विधियों द्वारा परोसा जाता है और इस प्रकार अभी भी कवर किया जाता है। –

2

में इस सेटिंग का उपयोग का हो सकता है पर विचार करें। प्रमाणीकरण टिकट में userdata के उपयोग पर ध्यान दें।

ASP.NET MVC - Set custom IIdentity or IPrincipal

+0

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

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