2009-08-14 20 views
7

लौटाता है मैं एक एएसपी.नेट एमवीसी ऐप को प्राधिकरण जोड़ने पर काम कर रहा हूं और सड़क ब्लॉक में चला गया हूं। मैं अंततः हमारे कस्टम सदस्यता प्रदाता को वायर्ड करने में सक्षम था और ऐप के लिए प्रमाणीकरण काम कर रहा था। अब, जैसा कि अपेक्षित है, अगर मैं अपने नियंत्रकों को [अधिकृत] विशेषता जोड़ता हूं, तो उपयोगकर्ता को पृष्ठ देखने के लिए प्रमाणित होना चाहिए। मैंने सफलतापूर्वक परीक्षण किया है [प्राधिकरण (उपयोगकर्ता = "{उपयोगकर्ता नाम}")] जो उस विशिष्ट उपयोगकर्ता को पृष्ठ को प्रतिबंधित करने के लिए भी काम करता है।HttpContext.Current.User.IsInRole (roleName) हमेशा झूठी

समस्या यह है कि [प्राधिकरण (भूमिकाएं = "{रोलनाम}")] जैसा कि मैं उम्मीद कर रहा हूं काम नहीं करता है। यदि मैं उस विशेषता को नियंत्रक में जोड़ता हूं, तो जब भी मैं संबंधित पृष्ठ तक पहुंचने का प्रयास करता हूं, तो मुझे हमारे लॉगिन पेज पर रीडायरेक्ट किया जाता है। यदि उपयोगकर्ता की आवश्यक भूमिका नहीं है तो यह वही होगा, लेकिन यह तब भी हो रहा है जब उपयोगकर्ता की भूमिका हो। मैंने एक दृश्य, एक नियंत्रक और एक सहायक विधि में उपयोगकर्ता .IsInRole ("{roleName}") और HttpContext.Current.User.IsInRole ("{roleName}") दोनों की जांच की है और यह हमेशा 'गलत' लौटाता है।

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

+0

अरे, आप हमें यह बताने के लिए अपना जवाब संपादित कर सकते हैं कि कॉन्फ़िगरेशन क्या थे - भविष्य में दूसरों की सहायता कर सकते हैं। – sirrocco

+0

सिरोक्रो - कॉन्फ़िगरेशन सेटिंग्स हमारे कार्यान्वयन और पर्यावरण के लिए विशिष्ट थीं, इसलिए वे किसी और के लिए किसी भी उपयोग का नहीं होगा। – Hamman359

+0

आपकी टिप्पणी ने मुझे अपने web.config को दोबारा जांचने के लिए प्रेरित किया और मैंने पाया कि भूमिका प्रबंधक नोड सक्षम था = "झूठा"। मैं सिर्फ लोगों को यह जानना चाहता था कि अगर यह अक्षम है तो यह IsInRole के लिए झूठा रिटर्न देता है क्योंकि आप किसी तरह के अपवाद को वापस करने के विरोध में हैं। –

उत्तर

4

पहला: एक प्रोफाइलर का उपयोग करें और HttpContext.Current.User.IsInRole ("{roleName}") को निष्पादित करते समय, जांचें कि SQL क्वेरी क्या है।

यदि यह कोई प्रश्न नहीं बना रहा है तो आपके पास शायद कैशरोल्स इनक्यूकी = "सत्य" है और IsInRole उपयोगकर्ता डेटा के लिए फॉर्म प्रमाणीकरण टिकट की जांच करेगा। सुनिश्चित करें कि जब आप फॉर्म प्रमाणीकरण टिकट बनाते हैं तो आप उपयोगकर्ता की भूमिकाओं के साथ उपयोगकर्ता अल्पविराम पैरामीटर को अल्पविराम सीमांकित स्ट्रिंग पर सेट करते हैं।

+0

धन्यवाद, इसने समस्या को हल नहीं किया, लेकिन इससे मुझे एक सड़क नीचे ले जाया गया जो अंत में हुआ। यह पता चला है कि कुछ अतिरिक्त कॉन्फ़िगरेशन सेटिंग्स थीं जिनकी भूमिका प्रदाता पूरी तरह से काम करने के लिए आवश्यक थी कि किसी ने मुझे बताने के लिए परेशान नहीं किया। एक बार जब मैं उन पर ठोकर खाई, सब कुछ 'जादुई' काम करना शुरू कर दिया। – Hamman359

+1

वह क्या था, मुझे एक ही समस्या है, क्या आप कृपया मुझे –

0

अपने ब्राउज़र कुकी कैश को साफ़ करने का प्रयास करें। मैंने थोड़ी देर में एक ही समस्या पर अपने सिर को टक्कर लगी, और मेरी कुकीज़ को साफ़ करने से समस्या हल हो गई।

0

मामले दूसरों में इस सवाल को खोजने:

मैं ने वही समस्या का सामना करना पड़ा और इस समस्या डोमेन समूह में रिक्त स्थान था। HttpContext.Current.User रिटर्न का उपयोग करके, IsInRole() पर कॉल प्री-विंडोज 2000 समूह नाम का उपयोग करके तुलना करने लगता है जिसमें रिक्त स्थान नहीं हैं।

मेरे मामले में समूह नाम से रिक्त स्थान को अलग करने से IsInRole() समस्या को हल किया गया।

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

वैकल्पिक रूप से आप System.DirectoryServices.AccountManagement.UserPrincipal इस्तेमाल कर सकते हैं और फोन IsMemberOf() जो डोमेन समूहों कि रिक्तियाँ के साथ बेहतर काम करना चाहिए:

यहाँ यह करने के लिए एक गंधा विस्तार विधि है।

2

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

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

यूप, लॉल, कृपया यह बता सकते हैं। ये सभी जटिल समाधान और यह एक साधारण स्विच बन गया है। धन्यवाद। –

1

एक पुराने विषय के बारे में थोड़ी है, लेकिन मैं एक ऐसी ही समस्या थी और में कारण था:

FormsAuthentication.SetAuthCookie(string, bool) 

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

यह [Authorize(Roles="rolename")] भी असफल होने का कारण बनता है, भले ही उपयोगकर्ता भूमिका में है, भले ही [Authorize] काम करता है।

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