दिलचस्प पोस्ट
कैसे ठीक करें: पूल का उपयोग करते समय "jdbc: mysql: // localhost / dbname" के लिए कोई उपयुक्त ड्राइवर नहीं मिला? एपीके फ़ाइल का कोड निकालने का तरीका क्या लचीले सरणी सदस्य सी ++ में मान्य हैं? TypeError: बाइट्स-जैसी ऑब्जेक्ट की आवश्यकता है, 'स्ट्र' नहीं LISTAGG फ़ंक्शन: "स्ट्रिंग संयोजन का परिणाम बहुत लंबा है" एंड्रॉइड के साथ जावा 7 भाषा की विशेषताएं iPhone SDK: जांचें कि क्या कोई UIAlertView दिखा रहा है क्यों मेरा सीएसएस बंडलिंग एक बिन तैनात MVC4 ऐप के साथ काम नहीं कर रहा है? जावास्क्रिप्ट में रेफ़रल को छिपाने / धोखा देने का सबसे विश्वसनीय तरीका क्या है? लिनक्स में सैंडबॉक्स में एक अविश्वसनीय सी प्रोग्राम चलाएं जो फाइल खोलने, फोर्किंग आदि से रोकता है? नोडजेएस एक्सप्रेस में मार्ग मैपिंग निकालें एक UIView की पृष्ठभूमि की छवि कैसे भरें java.io.IOException: होस्टनाम सत्यापित नहीं किया गया था मैं कार्यकर्ता थ्रेड के माध्यम से एक अवलोकन संकलन कैसे अपडेट कर सकता हूं? एंड्रॉइड स्टूडियो 1.4 में content_main.xml की भूमिका क्या है?

एएसपी.नेट एमवीसी – सेट कस्टम IIdentity या IPrincipal

मुझे काफी सरल करने की आवश्यकता है: अपने asp.net MVC आवेदन में, मैं एक कस्टम IIdentity / IPrincipal सेट करना चाहता हूं। जो भी आसान / अधिक उपयुक्त है मैं डिफ़ॉल्ट का विस्तार करना चाहता हूं ताकि मैं User.Identity.Id जैसे कुछ को कॉल कर User.Identity.RoleUser.Identity.Id और User.Identity.RoleUser.Identity.Role । कुछ फैंसी नहीं, बस कुछ अतिरिक्त गुण

मैंने कई लेख और सवालों को पढ़ा है लेकिन मुझे लगता है कि मैं वास्तव में यह की तुलना में कठिन बना रहा हूं। मैंने सोचा कि यह आसान होगा अगर कोई उपयोगकर्ता लॉग ऑन करता है, तो मैं एक कस्टम IIdentity सेट करना चाहता हूँ तो मैंने सोचा, मैं अपने global.asax में Application_PostAuthenticateRequest को लागू करेगा। हालांकि, इसे प्रत्येक अनुरोध पर कहा जाता है, और मैं हर अनुरोध पर डेटाबेस को कॉल नहीं करना चाहता जो कि डेटाबेस से सभी डेटा का अनुरोध करता है और कस्टम IPrincipal ऑब्जेक्ट डालता है। यह भी बहुत अनावश्यक, धीमा और गलत जगह (डेटाबेस कॉल करने के लिए वहाँ) लगता है, लेकिन मैं गलत हो सकता है या वह डाटा कहाँ से आएगा?

इसलिए मैंने सोचा, जब कोई उपयोगकर्ता लॉगिन करता है, तो मैं अपने सत्र में कुछ आवश्यक चर जोड़ सकता हूं, जो मैं Application_PostAuthenticateRequest ईवेंट हैंडलर में कस्टम IIdentity में जोड़ता हूं। हालांकि, मेरा Context.Session वहां null है, इसलिए भी जाने का रास्ता नहीं है।

मैं एक दिन के लिए इस पर काम कर रहा हूं और मुझे लगता है कि मुझे कुछ याद आ रहा है यह करना बहुत मुश्किल नहीं होना चाहिए, है ना? मैं भी कुछ (अर्द्ध) संबंधित सामान है जो इस के साथ आता है द्वारा थोड़ा भ्रमित हूँ। MembershipProvider , IIdentity , IIdentity , IIdentity , IIdentity , IIdentity , IIdentity …. क्या मैं केवल एक ही है जो यह सब बहुत भ्रमित करता है?

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

Solutions Collecting From Web of "एएसपी.नेट एमवीसी – सेट कस्टम IIdentity या IPrincipal"

यहाँ मैं यह कैसे कर रहा हूँ।

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

  1. इंटरफ़ेस बनाएं

     interface ICustomPrincipal : IPrincipal { int Id { get; set; } string FirstName { get; set; } string LastName { get; set; } } 
  2. CustomPrincipal

     public class CustomPrincipal : ICustomPrincipal { public IIdentity Identity { get; private set; } public bool IsInRole(string role) { return false; } public CustomPrincipal(string email) { this.Identity = new GenericIdentity(email); } public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 
  3. CustomPrincipalSerializeModel – FormsAuthenticationTicket ऑब्जेक्ट में userdata फ़ील्ड में कस्टम जानकारी serializing के लिए

     public class CustomPrincipalSerializeModel { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 
  4. लॉगइन विधि – कस्टम जानकारी के साथ एक कुकी सेट करना

     if (Membership.ValidateUser(viewModel.Email, viewModel.Password)) { var user = userRepository.Users.Where(u => u.Email == viewModel.Email).First(); CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel(); serializeModel.Id = user.Id; serializeModel.FirstName = user.FirstName; serializeModel.LastName = user.LastName; JavaScriptSerializer serializer = new JavaScriptSerializer(); string userData = serializer.Serialize(serializeModel); FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1, viewModel.Email, DateTime.Now, DateTime.Now.AddMinutes(15), false, userData); string encTicket = FormsAuthentication.Encrypt(authTicket); HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); Response.Cookies.Add(faCookie); return RedirectToAction("Index", "Home"); } 
  5. Global.asax.cs – कुकी पढ़ना और HttpContext.User ऑब्जेक्ट की जगह, यह PostAuthenticateRequest को ओवरराइड करके किया जाता है

     protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) { HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); JavaScriptSerializer serializer = new JavaScriptSerializer(); CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData); CustomPrincipal newUser = new CustomPrincipal(authTicket.Name); newUser.Id = serializeModel.Id; newUser.FirstName = serializeModel.FirstName; newUser.LastName = serializeModel.LastName; HttpContext.Current.User = newUser; } } 
  6. रेजर के दृश्य में पहुंचें

     @((User as CustomPrincipal).Id) @((User as CustomPrincipal).FirstName) @((User as CustomPrincipal).LastName) 

और कोड में:

  (User as CustomPrincipal).Id (User as CustomPrincipal).FirstName (User as CustomPrincipal).LastName 

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

अतिरिक्त रूप से उपयोग को आसान बनाने के लिए आप एक बेस नियंत्रक बना सकते हैं और लौटा उपयोगकर्ता ऑब्जेक्ट ओवरराइड कर सकते हैं (HttpContext.User):

 public class BaseController : Controller { protected virtual new CustomPrincipal User { get { return HttpContext.User as CustomPrincipal; } } } 

और फिर, प्रत्येक नियंत्रक के लिए:

 public class AccountController : BaseController { // ... } 

जो आपको इस तरह के कोड में कस्टम फ़ील्ड का उपयोग करने की अनुमति देगा:

 User.Id User.FirstName User.LastName 

लेकिन यह दृश्यों के अंदर काम नहीं करेगा। इसके लिए आपको एक कस्टम WebViewPage कार्यान्वयन बनाने की आवश्यकता होगी:

 public abstract class BaseViewPage : WebViewPage { public virtual new CustomPrincipal User { get { return base.User as CustomPrincipal; } } } public abstract class BaseViewPage<TModel> : WebViewPage<TModel> { public virtual new CustomPrincipal User { get { return base.User as CustomPrincipal; } } } 

दृश्य / web.config में इसे एक डिफ़ॉल्ट पृष्ठ प्रकार बनाएं:

 <pages pageBaseType="Your.Namespace.BaseViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> </namespaces> </pages> 

और विचारों में, आप इसे इस तरह से उपयोग कर सकते हैं:

 @User.FirstName @User.LastName 

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

इस पर एक अच्छा लेख: http://www.ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html (टूटी कड़ी)

संपादित करें:

चूंकि उपर्युक्त लिंक टूटा हुआ है, इसलिए मैं ऊपर दिए अपने उत्तर में एलआईसीपी के समाधान की सिफारिश करेगा: https://stackoverflow.com/a/10524305 – मैं यह भी सुझाव दूंगा कि स्वीकार किए जाते हैं जवाब को उस एक में बदल दिया जाएगा।

2 संपादित करें: टूटी कड़ी के लिए एक विकल्प: https://web.archive.org/web/20120422011422/http://ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html

यहां काम करने के लिए यहां एक उदाहरण है। bool isValid कुछ डेटा स्टोर को देखकर सेट होता है (अपने उपयोगकर्ता डेटा बेस को बताएं)। UserID सिर्फ एक आईडी है जो मैं रखता हूं। आप विज्ञापन संबंधी जानकारी जैसे ईमेल डेटा को उपयोगकर्ता डेटा में जोड़ सकते हैं।

 protected void btnLogin_Click(object sender, EventArgs e) { //Hard Coded for the moment bool isValid=true; if (isValid) { string userData = String.Empty; userData = userData + "UserID=" + userID; FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(30), true, userData); string encTicket = FormsAuthentication.Encrypt(ticket); HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); Response.Cookies.Add(faCookie); //And send the user where they were heading string redirectUrl = FormsAuthentication.GetRedirectUrl(username, false); Response.Redirect(redirectUrl); } } 

गोल्बल एएसएक्स में आपकी जानकारी पुनर्प्राप्त करने के लिए निम्न कोड जोड़ें

 protected void Application_AuthenticateRequest(Object sender, EventArgs e) { HttpCookie authCookie = Request.Cookies[ FormsAuthentication.FormsCookieName]; if(authCookie != null) { //Extract the forms authentication cookie FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); // Create an Identity object //CustomIdentity implements System.Web.Security.IIdentity CustomIdentity id = GetUserIdentity(authTicket.Name); //CustomPrincipal implements System.Web.Security.IPrincipal CustomPrincipal newUser = new CustomPrincipal(); Context.User = newUser; } } 

जब आप बाद में जानकारी का उपयोग करने जा रहे हैं, तो आप अपने कस्टम प्रिंसिपल का उपयोग इस प्रकार कर सकते हैं।

 (CustomPrincipal)this.User or (CustomPrincipal)this.Context.User 

यह कस्टम उपयोगकर्ता जानकारी तक पहुंचने की अनुमति देगा।

एमवीसी आपको अपने नियंत्रक वर्गों से लटका हुआ OnAuthorize विधि प्रदान करता है। या, आप अधिकृत करने के लिए कस्टम क्रिया फ़िल्टर का उपयोग कर सकते हैं। एमवीसी यह करना आसान बनाता है। मैंने इस बारे में एक ब्लॉग पोस्ट पोस्ट किया है http://www.bradygaster.com/post/custom-authentication-with-mvc-3.0

यहां एक समाधान है यदि आपको अपने विचारों में उपयोग के लिए कुछ तरीकों को अप करने के लिए @ उपयोगकर्ता को अप करने की ज़रूरत है किसी भी गंभीर सदस्यता अनुकूलन के लिए कोई समाधान नहीं है, लेकिन अगर मूल प्रश्न केवल विचारों के लिए आवश्यक है, तो शायद यह पर्याप्त होगा नीचे एक authorizefilter से लौटाई गई एक चर की जाँच करने के लिए उपयोग किया गया था, यह सत्यापित करने के लिए उपयोग किया गया था कि क्या कुछ लिंक प्रस्तुत किए गए हैं या नहीं (किसी प्रकार की प्राधिकरण तर्क या पहुंच प्रदान करने के लिए नहीं)।

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Security.Principal; namespace SomeSite.Web.Helpers { public static class UserHelpers { public static bool IsEditor(this IPrincipal user) { return null; //Do some stuff } } } 

फिर बस वेब। कॉन्फ़िग के क्षेत्रों में एक संदर्भ जोड़ें, और इसे नीचे दृश्य की तरह देखें

 @User.IsEditor() 

ल्यूकप के उत्तर के आधार पर, और requireSSL सेटअप सेटअप करने के लिए कुछ तरीके जोड़ते हैं और requireSSLrequireSSL के साथ सहयोग करते हैं।

संदर्भ लिंक

  • एमएसडीएन, समझाया: ASP.NET 2.0 में प्रपत्र प्रमाणन
  • एमएसडीएन, फॉर्म एटिफिकेशन क्लास
  • SO, .net एक्सेस फॉर्म प्रमाणन कोड में "टाइमआउट" मान

ल्यूकपी के संशोधित कोड

1, Web.Config पर आधारित timeout सेट timeout । FormsAuthentication.Timeout को टाइमआउट मान मिलेगा, जिसे web.config में परिभाषित किया गया है। मैंने अनुवर्ती कार्यों को एक समारोह में लपेट कर दिया था, जो एक ticket वापस लौटते थे।

 int version = 1; DateTime now = DateTime.Now; // respect to the `timeout` in Web.config. TimeSpan timeout = FormsAuthentication.Timeout; DateTime expire = now.Add(timeout); bool isPersist = false; FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( version, name, now, expire, isPersist, userData); 

2, सुरक्षा को संरक्षित करने के लिए कुकी को कॉन्फ़िगर करें या नहीं, RequireSSL कॉन्फ़िगरेशन के आधार पर।

 HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); // respect to `RequreSSL` in `Web.Config` bool bSSL = FormsAuthentication.RequireSSL; faCookie.Secure = bSSL; 

यदि आप अपने पन्नों के पीछे के कोड में पहुंच को आसान बनाना चाहते हैं, तो वेब फॉर्म यूज़र्स (एमवीसी के लिए) के लियूपी कोड में एक अतिरिक्त के रूप में, बस नीचे दिए गए कोड को बेस पेज पर जोड़ें और अपने सभी पृष्ठों में बेस पेज प्राप्त करें:

 Public Overridable Shadows ReadOnly Property User() As CustomPrincipal Get Return DirectCast(MyBase.User, CustomPrincipal) End Get End Property 

तो आप के पीछे अपने कोड में बस का उपयोग कर सकते हैं:

 User.FirstName or User.LastName 

वेब प्रपत्र परिदृश्य में जो कुछ मुझे याद आ रहा है, वह है कि कोड में समान व्यवहार को प्राप्त करने के लिए पेज से जुड़ा नहीं है, उदाहरण के लिए, httpmodules में मुझे हमेशा प्रत्येक वर्ग में एक कलाकार जोड़ना चाहिए या क्या यह प्राप्त करने का एक चालाक तरीका है?

आपके उत्तर के लिए धन्यवाद और एलआईसीपी के लिए शुक्रिया, क्योंकि मैंने अपने उदाहरणों को मेरे कस्टम यूजर के लिए आधार के रूप में प्रयोग किया था (जो अब उपयोगकर्ता है। User.Roles , User.Tasks User.Roles , User.TasksUser.HasPath(int) , User.Settings.Timeout और कई अन्य अच्छी चीजें)

ठीक है, इसलिए मैं यह बहुत पुरानी सवाल खींचकर यहां एक गंभीर क्रिप्टकीपर हूं, लेकिन इसके लिए एक बहुत सरल दृष्टिकोण है, जो कि ऊपर @ बैज़र द्वारा छू गया था। और यह सी # एक्सटेंशन विधियों और कैशिंग के संयोजन का उपयोग करना है (सत्र का उपयोग न करें)

वास्तव में, माइक्रोसॉफ्ट ने पहले ही माइक्रोसॉफ्ट में कई ऐसे एक्सटेंशन उपलब्ध कराए हैं। एस्पनेट। आईडेंटीटी। आईडेंटिटी एक्स्टेंशन नेमस्पेस उदाहरण के लिए, GetUserId() एक एक्सटेंशन विधि है जो उपयोगकर्ता आईडी देता है वहाँ भी GetUserName() और GetUserName() , जो IPrincipal पर आधारित दावा देता है।

तो आपको केवल नाम स्थान को शामिल करने की ज़रूरत है, और फिर उपयोगकर्ता नाम User.Identity.GetUserName() । उपयोगकर्ता नाम। उपयोगकर्ता नाम प्राप्त करने के लिए asp.net पहचान द्वारा कॉन्फ़िगर किया गया है।

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