2012-12-04 40 views
5

मैं निम्नलिखित परीक्षण सेटअप, सभी काम कर रहे है wsHttpBinding और MVC का उपयोग कर:Roles.IsUserInRole() WCF में काम नहीं कर 4

-WCF आवेदन एक MathService.svc चल रहा है, सेटअप SimpleMembershipProvider

-MVC उपयोग करने के लिए 4 इंटरनेट अनुप्रयोग डिफ़ॉल्ट का उपयोग कर SimpleMembershipProvider

-Membership है:

  • 3 भूमिका: 'डिबग', 'प्रशासक' और 'संपादक'
  • 2 उपयोगकर्ता: भूमिका प्रशासक

-Certificates में भूमिका डिबग और प्रशासक (फिर, भूमिका डिबग में उपयोगकर्ता डिबग)

  • 'व्यवस्थापक' में 'डिबग', जहाँ तक मैं बता काम कर रहे हैं कर सकते हैं, मैं wshttp

    सेवा विधि कोड का उपयोग कर सेवा से कनेक्ट कर सकते हैं।

    //[PrincipalPermission(SecurityAction.Demand, Role = "Debug")] 
    public string Add(double A, double B) 
    { 
        OperationContext oc = OperationContext.Current; 
        ServiceSecurityContext ssc = oc.ServiceSecurityContext; 
        string cltName = ssc.PrimaryIdentity.Name; //cltName = "Debug" 
        var Rs = Roles.GetAllRoles(); //returns: 'Debug', 'Administrator', 'Editor' => OK 
        var dUsers = Roles.GetUsersInRole("Debug"); // 'Debug' => Expected 
        var aUsers = Roles.GetUsersInRole("Administrator"); // 'Debug', 'Admin' => expected 
        try 
        { 
         var a = Roles.GetRolesForUser(cltName); //this fails 
         var b = Roles.IsUserInRole(cltName, "Debug"); //this fails 
         var c = Roles.IsUserInRole(cltName, "Administrator"); //this fails 
        } 
        catch (Exception err) 
        { 
         string p = err.Message; // all fail with error : 
         // "Object reference not set to an instance of an object", inner exception=null 
        } 
        if (dUsers.Contains(cltName)) //this works, but requires extra step 
         //I should be able to us if(Roles.IsUserInRole(cltName, "Debug"))... here?!? 
        { 
         return string.Format("Result: {0}", (A + B).ToString("N2")); 
        } 
        else 
        { //this is just to get a different result if NOT in role 'Debug' 
         return string.Format("Result: {0}", ((int)A + (int)B).ToString("N2")); 
        } 
    } 
    

    'Roles.GetRolesForUser (cltName)' और IsUserInRole में नाकाम रहने के लिए कॉल क्यों हैं?

    मुझे 'ServiceSecurityContext', से सही उपयोगकर्ता नाम मिलता है यदि मैं [प्रिंसिपलप्रमिशन] अट्रिब को सक्षम करता हूं तो मुझे अस्वीकार कर दिया जाता है यदि मैं उपयोगकर्ता व्यवस्थापक के साथ सेवा को कॉल करता हूं।

    तो प्रिंसिपलप्रमिशन सही उपयोगकर्ता भूमिका क्यों प्राप्त कर पाएगा? मैं सभी सही उपयोगकर्ताओं को प्राप्त करने के लिए Roles.GetUsersInRole ("डीबग") का उपयोग क्यों कर सकता हूं लेकिन मैं Roles.IsUserInRole (..) को कॉल नहीं कर सकता ??

    प्रमाण पत्र/सदस्यता सेटअप त्रुटियों का सुझाव देने वाली कुछ पोस्ट हैं, लेकिन मैं नहीं देख सकता कि मैं अब तक कैसे प्राप्त कर सकता हूं और अभी भी गलत सेटअप कर सकता हूं, और सबसे ऊपर, केवल कुछ भूमिकाएं विफल हो गई हैं, सभी नहीं। कोई संकेतक?

    वापसी परिणाम के बारे में एक शब्द, अगर मैं अपने रोल तरीके का उपयोग करें और डीबग के माध्यम से कहते हैं, सेवा डबल परिशुद्धता देता है, अगर मैं व्यवस्थापक के साथ फोन [PrincipalPermission] विकलांग, मैं पूर्णांक परिशुद्धता वापस

    सादर, एंड्रियास मिल

  • +0

    भी हो काम करता है में मदद करता है: http://msdn.microsoft.com/en-us/library/ff648163.aspx –

    +0

    मैं पीछा किया कि उदाहरण wsHTTP की स्थापना, और हां, वे "अनिवार्य भूमिका जांच" और भूमिकाओं का उपयोग करते हैं। IsUserInRole()। लेकिन वे डिफ़ॉल्ट एएसपी.NET सदस्यता भूमिका प्रदाता का भी उपयोग करते हैं। मैं एमवीसी 4 और नया SimpleMembership प्रदाता का उपयोग करता हूं। इस लिंक में कुछ भी नहीं है जिसके बारे में मुझे पता चल सकता है कि यह विशिष्ट विधि – Andreas

    उत्तर

    4

    बस अगर कोई भी एक ही समस्या में चला जाता है।

    जबकि आप सरल स्मृति के साथ 'पुरानी' एएसपीनेट रोल्सप्रोवाइडर का उपयोग कर सकते हैं, वे समान नहीं हैं।

    मेरे मामले में, मुझे एक साधारण कलाकार जोड़ना पड़ा।

    var _simpleRoles = (SimpleRoleProvider)Roles.Provider; //need the cast to simple 
    

    और फिर इस

    var b = simpleRoles.IsUserInRole(cltName, "Debug"); 
    
    +1

    क्यों काम नहीं कर रही है मेरे मामले में मुझे 'भूमिकाएं' IsUserInRole (...) 'के बजाय 'Roles.Provider.IsUserInRole()' लिखना पड़ा। – Simon