6

स्पष्ट रूप से बोली जाने वाली मैं एएसपी.नेट एमवीसी के लिए काफी नया हूं इसलिए मैं आपको अपने प्रश्न के बारे में बताते हुए मुझसे बेझिझक पूछता हूं। मुझे क्या चाहिए ?! मेरे पास एक एएसपी.NET पहचान प्रणाली सेटअप है और बाहरी लॉगिन के साथ चल रहा है। एएसपी.NET पहचान प्रमाणीकरण के बाद मुझे किसी भी कारण से कस्टम प्रमाणीकरण स्थापित करने की आवश्यकता है। मुझे समझाने दो कैसे? आइए कहें कि मेरे पास मेरे एप्लिकेशन, पेज ए, बी, सी पर देखने के लिए तीन पेज हैं। पेज ए कौन देख सकता है? किसी अनाम उपयोगकर्ता पेज ए कौन देख सकता है पृष्ठ एक & बी देख सकते हैं? कोई भी उपयोगकर्ता जिसने अपना ईमेल & पासवर्ड या बाहरी लॉगिन के साथ खाता बनाया है। पृष्ठ ए, बी & सी कौन देख सकता है?एएसपीएनटी एमवीसी पहचान पर कस्टम प्रमाणीकरण कैसे सेट करें?

यहां वह स्थान है जहां मैं कस्टम प्रमाणीकरण सेट करना चाहता हूं। कोई भी उपयोगकर्ता जिसने अपने ईमेल खाते या बाहरी लॉगिन के साथ खाता बनाया है और उसके पास वैध सीरियल कुंजी है। सीरियल कुंजी? मैं नीचे के रूप में ASP.NET पहचान में एक वर्ग सेट:

public class UserDetails : IdentityUser 
    { 
     public virtual MembershipSerial MembershipSerial { get; set; } 
    } 

    public class MembershipSerial 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int Id { get; set; } 
     [HiddenInput(DisplayValue=false)] 
     public string Serial { get; set; } 
     [Required] 
     [Display(Name="Membership Serial")] 
     public string SerialConfirmed { get; set; } 
    } 

    public class MyDbContext : IdentityDbContext<UserDetails> 
    { 
     public MyDbContext() 
      : base ("EFDbContext") 
     { 
     } 
     public System.Data.Entity.DbSet<MembershipSerial> MembershipSerial { get; set; } 
    } 

मैं वर्ग में तीन प्रॉपर्टी सेट अप आप श्रेणी से ऊपर देख। फील्ड आईडी धारावाहिकों के आईडी के लिए है, सीरियल एक 14 अल्फा न्यूमेरिक अक्षर है जो व्यवस्थापक द्वारा दर्ज किया जाता है और जैसा कि आप देख सकते हैं कि यह एक छिपी हुई फ़ील्ड है जो शून्य की अनुमति नहीं दे रहा है। क्षेत्र SerialConfirmed भी एक 14 अल्फा न्यूमेरिक अक्षरों है जो उपयोगकर्ताओं द्वारा एप्लिकेशन में कुछ निश्चित कार्यों को करने के लिए प्रमाणीकृत करने के लिए दर्ज किया जाएगा। पूरी अवधारणा यह है कि लॉग इन उपयोगकर्ता को दूसरे प्रकार के प्रमाणीकरण के लिए धक्का दिया जाना चाहिए जो प्रमाणीकरण बनाम धारावाहिक संख्या है।

मुझे गंभीरता से मदद की ज़रूरत है और ऑनलाइन खोज करने से बहुत मदद नहीं मिली है। अगर आपको अधिक जानकारी चाहिए या फिर भी यह अस्पष्ट है तो मुझसे पूछने में संकोच नहीं करें। सम्मान संपादित करें: मैं पहले ईएफ कोड का उपयोग कर रहा हूं। Dostdar

+0

तो, परिदृश्य यह है कि कोई उपयोगकर्ता लॉग इन करता है, किसी प्रकार के किसी पृष्ठ को एक्सेस करने का प्रयास करता है (या कुछ क्रिया निष्पादित करता है), और उसके बाद किसी प्रकार की चुनौती UI के साथ प्रस्तुत किया जाता है? अगर वे एक वैध कोड दर्ज करते हैं, तो उन्हें उस पृष्ठ तक पहुंचने की अनुमति है, और केवल वह पृष्ठ (या कार्रवाई)? –

+0

@TiesonT। वास्तव में यही है कि मैं –

+1

कुछ मामलों में धारावाहिकों के साथ प्रमाणीकरण करने वाले को कई क्रियाएं करने की अनुमति है –

उत्तर

0

यह एक कस्टम प्राधिकरण विशेषता काम करेगा की तरह लगता है। यहाँ एक उदाहरण कार्यान्वयन है:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] 
public class RequiresSerialValidationAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool hasValidSerial = false; 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      string userName = filterContext.HttpContext.User.Identity.Name; 

      if (!string.IsNullOrWhiteSpace(userName)) 
      {  
       string serial = string.Empty;// TODO: Retrieve user's previously authenticated serial, perhaps from Session or a cookie? 

       if(!string.IsNullOrWhiteSpace(serial)) 
       { 
        var service = DependencyResolver.Current.GetService<IYourAuthService>(); 
        hasValidSerial = service.IsSerialValidForUser(userName, serial); 
       } 
      } 
     } 

     if (!hasValidSerial) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "yourserialauthcontroller", action = "yourauthaction", area = string.Empty })); 
     } 
     else 
     { 
      base.OnAuthorization(filterContext); 
     } 
    } 
} 

आप इस विशेषता के साथ कार्रवाई के तरीकों को सजाने होगा:

[RequireSerialValidation] 
public ActionResult SomeAction() 
{ 
} 

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

आपकी प्रमाणीकरण सेवा जो कुछ भी आप चाहते हैं वह हो सकती है। इस उदाहरण में, मुझे लगता है कि आप निर्भरता इंजेक्शन का उपयोग कर रहे हैं और आपने वैश्विक निर्भरता रिज़ॉल्वर को कॉन्फ़िगर किया है।(अन्य तरीकों को छोड़ते हुए) अपने IYourAuthService ऐसा दिखाई दे सकता है कि, यह देखते हुए:

public IYourAuthService 
{ 
    bool IsSerialValidForUser(string userName, string serial); 
} 
एक कार्यान्वयन इसलिए की तरह साथ

:

public YourAuthService : IYourAuthService 
{ 
    public bool IsSerialValidForUser(string userName, string serial) 
    { 
     using(var context = new YourEntityFrameworkDbContext()) 
     { 
      return context.Users.Any(u => u.UserName.Equals(userName, StringComparison.OrdinalIgnoreCase) && u.Serial.Equals(serial, StringComparison.OrdinalIgnoreCase)); 
     } 
    } 
} 

इसका मतलब यह है कि आप एक मेज अपने डेटाबेस में User (या Users) कहा जाता है , और UserName और Serial उस तालिका में फ़ील्ड हैं। StringComparison.OrdinalIgnoreCase आपको उन स्ट्रिंग्स पर केस-असंवेदनशील, संस्कृति-असंवेदनशील मिलान करने देता है, जिन्हें आप तुलना करने का प्रयास कर रहे हैं।

+0

मैं उपयोगकर्ता द्वारा दर्ज सीरियल की तुलना कैसे कर सकता हूं, मेरे पास पहले से ही मेरी एसक्यूएल तालिका में है? –

+0

यह सेवा वर्ग के आपके संस्करण में होगा जो मैं "var service = ..." से शुरू होने वाली रेखा में उल्लिखित हूं। –

+0

टायसन मैं आपको यह पूछने के लिए वास्तव में क्षमा चाहता हूं, क्योंकि आप जानते हैं कि मैं वास्तव में एक नौसिखिया हूं, क्या आप डेटाबेस से डेटा लाने और दोनों की तुलना करने के लिए अपना प्रश्न अपडेट कर सकते हैं? मैंने कड़ी मेहनत की लेकिन उपरोक्त कोड से विशेषज्ञ स्तर पर कुछ भी नहीं पकड़ सका। आपके प्रयास के लिए बहुत बहुत धन्यवाद। मुझे वास्तव में आपकी सहायता की आवश्यकता है –

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