6

मैं प्रमाणीकरण और प्रमाणीकरण के बारे में ऑनलाइन सामानों का एक टन पढ़ रहा हूं और आखिरकार कुछ कोड पर बस गया है जो काम कर रहा है ... लेकिन मैं यह सब कुछ पूरी तरह से समझ नहीं पा रहा हूं (जहां तक ​​फॉर्म प्रमाणीकरण टिकट)।Windows प्रमाणीकरण के साथ Forms प्रमाणीकरण टिकट का उपयोग क्यों करें?

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

मैं विंडोज ऑथ का उपयोग कर रहा हूं;

<authentication mode="Windows" /> 
<authorization>  
    <deny users="?"/> 
</authorization> 

मेरे पास अतिरिक्त उपयोगकर्ता और अनुमति जानकारी के साथ SQL सर्वर में तालिकाओं का एक सेट है।

  • उपयोगकर्ता
  • भूमिकाओं
  • UsersInRoles
  • अन्य तालिकाओं कि आवेदन में वस्तुओं और संबद्ध अनुमतियाँ परिभाषित करते हैं।

    1. क्यों WindowsAuthentication_OnAuthenticate में एक FormsAuthenticationTicket है:

मेरी Global.asax में मैं निम्न विधियों

http://www.codeproject.com/Articles/5182/Insight-into-Security-Model-using-Principal-and-Id

protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e) 
{ 
    if (e.Identity == null || !e.Identity.IsAuthenticated) 
    { 
    //Redirect to error or access denied page 
    } 

    string userData = e.Identity.AuthenticationType;   

    var cachedUser = HttpContext.Current.Cache[e.Identity.Name] as User; 

    if (cachedUser == null) 
    { 
    var user = repo.GetUserByFullUserName(e.Identity.Name); 
    HttpContext.Current.Cache.Insert(e.Identity.Name, user, null, DateTime.Now.AddMinutes(2), Cache.NoSlidingExpiration); 
    cachedUser = HttpContext.Current.Cache[e.Identity.Name] as User; 
    } 

    var userIdentity = e.Identity.Name; 

    var formsAuthTicket = new FormsAuthenticationTicket(1, e.Identity.Name, DateTime.Now, DateTime.Now.AddMinutes(2), false, userData); 

    var encryptedTicket = FormsAuthentication.Encrypt(formsAuthTicket); 
    var httpcook = new HttpCookie("authCookie", encryptedTicket); 
    Response.Cookies.Add(httpcook); 
} 



protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (Request.IsAuthenticated) 
    { 
    var httpcook = Context.Request.Cookies["authCookie"]; 
    var formsAuthTicket = FormsAuthentication.Decrypt(httpcook.Value); 

    var cachedUser = GetCachedUser(formsAuthTicket.Name); 
    if (cachedUser == null) 
     { 
     cachedUser = CreateCachedUser(formsAuthTicket.Name); 
     } 

    var genIdentity = new GenericCustomIdentity(cachedUser, Request.IsAuthenticated, formsAuthTicket.UserData); 

    var genPrincipal = new GenericCustomPrincipal(genIdentity, cachedUser); 

    HttpContext.Current.User = genPrincipal; 
    } 
} 
तो यहाँ

से प्रेरित किया है मेरी सवाल कर रहे हैं तरीका? क्या मैं WinAuth विधि में सिर्फ अपनी पहचान और प्रिंसिपल ऑब्जेक्ट्स नहीं बना सकता?

  • एचटीपीकॉन्टेक्स्ट.कुरेंट में उपयोगकर्ता डेटा संग्रहीत कर रहा है। सुरक्षा जोखिम कैश करें? चूंकि इन तरीकों को कई बार बुलाया जाता है, इसलिए मैं प्रत्येक अनुरोध को डीबी हिट नहीं करना चाहता हूं। क्या कोई बेहतर/अधिक सुरक्षित विकल्प है?

  • मैं प्रपत्र प्रमाणीकरण टिकट, पहचान, और प्रिंसिपल का उपयोग करने से अपरिचित हूं, इसलिए किसी भी टिप्पणी या सुझावों की बहुत सराहना की जाएगी। क्षमा करें, यह कोई सवाल नहीं था।

  • +0

    [कभी भी एएसपी.NET एमवीसी को लॉक करने के लिए web.config का उपयोग न करें] (http://stackoverflow.com/questions/11765030/how-to-lock-down-paths-in-asp-net-mvc-4) –

    +0

    क्या यह विंडोज प्रमाणीकरण पर भी लागू होता है? कोई पंजीकरण फॉर्म या लॉगिन स्क्रीन नहीं है। मुझे सबसे अधिक संभावना उपयोगकर्ता मिलेगा। ध्यान दें और मेरे डेटाबेस में 'डिफ़ॉल्ट' रिकॉर्ड बनाएं और फिर व्यवस्थापक को किसी अन्य समय अन्य अनुमतियां या प्रतिबंध लागू करने दें। मेरे पास अभी तक सभी विवरण नहीं हैं लेकिन वैध एडी खाते वाले किसी भी उपयोगकर्ता को एक्सेस की अनुमति दी जानी चाहिए और किसी और को नहीं करना चाहिए। इस मामले में क्या मुझे लिंक में सुझावों का पालन करना चाहिए या web.config को छोड़ देना चाहिए? – killerbunnyattack

    उत्तर

    3

    क्यों WindowsAuthentication_OnAuthenticate विधि में एक FormsAuthenticationTicket है? क्या मैं WinAuth विधि में सिर्फ अपनी पहचान और प्रिंसिपल ऑब्जेक्ट्स नहीं बना सकता?

    पहचान और प्रिंसिपल ऑब्जेक्ट केवल क्लाइंट से वर्तमान कॉल/अनुरोध के दौरान मौजूद हैं। वे HttpContext का हिस्सा हैं और अनुरोध के अंत में का निपटान करने के लिए बेहतर अवधि की कमी के लिए हैं। एक बार जब प्रमाणीकृत व्यक्ति को फिर से कनेक्ट किया जाता है, तो एक नया अनुरोध बनाया जाता है, और डिफ़ॉल्ट रूप से वे authenitcated नहीं हैं।

    FormsAuthenticationTicket (डिफ़ॉल्ट रूप से) प्रत्येक बाद के अनुरोध के लिए प्रमाणीकरण जानकारी संग्रहीत करने के लिए ग्राहक पक्ष पर एक कुकी का उपयोग करता है। यह अनुरोध को पुनः प्राधिकृत करने के लिए कुकी का उपयोग करने के लिए Application_AuthenticateRequest विधि की अनुमति देता है।

    एचटीपीकॉन्टेक्स्ट.कुरेंट में उपयोगकर्ता डेटा संग्रहीत कर रहा है। सुरक्षा जोखिम कैश करें?चूंकि इन तरीकों को कई बार बुलाया जाता है, इसलिए मैं प्रत्येक अनुरोध को डीबी हिट नहीं करना चाहता हूं। क्या कोई बेहतर/अधिक सुरक्षित विकल्प है?

    HttpContext.Cache स्मृति में संग्रहीत है। यदि सर्वर रीसेट हो जाता है या ऐप पूल किसी भी कारण से पुन: प्रारंभ होता है तो कैश चला जाता है।

    हां यह एक सुरक्षा जोखिम है, आप उपयोगकर्ता की जानकारी संग्रहीत कर रहे हैं सर्वर मेमोरी है। हालांकि जोखिम बहुत छोटा है, जब तक कि कोई व्यक्ति आपके कोड को कैश का उपयोग नहीं कर रहा था, और कैश पढ़ने के लिए कोड अपलोड कर सकता था।

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

    HttpContext.User (IPrincipal) के लिंक के बारे में कैसे इसकी संपत्ति के साथ IIdentity की पहचान। सबसे वर्णनात्मक उत्तर नहीं है, लेकिन दोनों इंटरफेस बेहद बुनियादी हैं।

    +1

    मैं भी उल्लेख करना भूल गया, एक और सुरक्षा जोखिम उपयोगकर्ता को संपादित कर रहा है ताकि वे लॉग इन नहीं कर सकें। यदि यह उपयोगकर्ता जानकारी कैश में है, तो उपयोगकर्ता अभी भी लॉग इन कर सकता है, क्योंकि यह एक कैश संस्करण है। –

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