9

मैं फॉर्म प्रमाणीकरण का उपयोग करने की कोशिश कर रहा हूं और यह उपयोगकर्ता नाम और पासवर्ड के साथ इस समय ठीक काम कर रहा है। मुझे फॉर्म प्रमाणीकरण टिकट में उपयोगकर्ता भूमिका जोड़ने की जरूरत है और मैं एएसपी.NET सदस्यता का उपयोग नहीं कर रहा हूं।सदस्यता के बिना फॉर्म प्रमाणीकरण भूमिका

if (rep.CheckUser(model.UserName, model.Password,out UserRole))//Check User 
    { 

    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

// Roles.AddUserToRole(model.UserName, UserRole);//This Requires Membership 

    return Redirect(FormsAuthentication.DefaultUrl); 

} 
+0

भूमिकाओं के साथ काम करने के लिए अब आप किस तंत्र का उपयोग कर रहे हैं? –

+0

@HuseinRoncevic मेरी डेटाबेस तालिका में मेरे पास उपयोगकर्ता नाम, पासवर्ड और उपयोगकर्ता के लिए भूमिका है। मैं डेटाबेस तालिका से प्रमाणीकरण टिकट – chamara

+0

पर पुनर्प्राप्त भूमिका को पास करना चाहता हूं, यह सुनिश्चित नहीं है कि यह इस तरह से काम करता है। आप केवल उपयोगकर्ता नाम को कुकी कुकी में डालते हैं और फिर प्रत्येक आने वाले अनुरोध के लिए आप ऑथ कुकी से उपयोगकर्ता नाम पढ़ते हैं और डेटाबेस से अन्य विवरण लोड करते हैं। यह 'एक्शनफिल्टर' में किया जा सकता है। – Suhas

उत्तर

20

FormsAuthenticationTicket निर्माता (सबसे मानकों के साथ एक) userData पैरामीटर जो एक स्ट्रिंग लेता है। यह यहां है कि आप कुछ भूमिकाओं जैसे पाइप (|) या हैश से अलग अपनी भूमिका जोड़ सकते हैं। आप कैसे उपयोग करने की योजना बना रहे हैं आप पर निर्भर है। आप आमतौर पर AuthenticateRequest ईवेंट पंजीकृत करना चाहते हैं।

private void CreateTicket() 
{ 
    var ticket = new FormsAuthenticationTicket(
      version: 1, 
      name: UserName, 
      issueDate: DateTime.Now, 
      expiration: DateTime.Now.AddSeconds(httpContext.Session.Timeout), 
      isPersistent: false, 
      userData: String.Join("|", arrayOfRoles)); 

    var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

    httpContext.Response.Cookies.Add(cookie); 
} 

global.asax में आप कुछ इस तरह करना होगा उसके बाद:: तो, आप एक टिकट इस था बना सकते हैं

public override void Init() 
{ 
    base.AuthenticateRequest += OnAuthenticateRequest; 
} 

private void OnAuthenticateRequest(object sender, EventArgs eventArgs) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     var decodedTicket = FormsAuthentication.Decrypt(cookie.Value); 
     var roles = decodedTicket.UserData.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries); 

     var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles); 
     HttpContext.Current.User = principal; 
    } 
} 

अब आप IPrincipal वस्तु में भूमिका (HttpContext.Current.User) है और आप के साथ क्वेरी जब HttpContext.Current.User.IsUserInRole("RoleName") आपको सच या गलत मिलेगा। इस तरह आप Roles प्रदाता का उपयोग करने से बचने में सक्षम होना चाहिए।

अपडेट: उपयोगकर्ता प्रिंसिपल को पुनर्स्थापित करने के लिए कॉल करने के लिए एक बेहतर घटना BeginRequest के बजाय Application_AuthenticateRequest है। मैंने इसे प्रतिबिंबित करने के लिए कोड अपडेट किया है।

+3

अच्छा जवाब, हालांकि यह प्रमाणीकृत नहीं है, तो यह शून्य संदर्भ अपवाद फेंकता है। 'Base.PostAuthenticateRequest + = OnAfterAuthenticateRequest; 'इसके बजाय – Burjua

+1

अच्छा उत्तर का उपयोग करें। लेकिन यदि आप मानक फॉर्म प्राधिकरण का उपयोग कर रहे हैं तो आपको टिकट को फिर से डिक्रिप्ट करने की आवश्यकता नहीं है ... आप बस 'var decodedTicket = ((FormsIdentity) HttpContext.Current.User.Identity) कह सकते हैं। टिकट; ' – kape123

+0

मैंने कोशिश नहीं की है यह ज्यादातर क्योंकि मैं टिकट एन्क्रिप्ट कर रहा हूं। हालांकि, मैं इसे एक शॉट दे दूँगा। धन्यवाद। –

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