2009-08-24 15 views
6

मैं एक WCF सेवा ओवरराइड मान्य() System.IdentityModel.Selectors.UserNamePasswordValidator वर्ग की विधि के माध्यम से कस्टम उपयोगकर्ता नाम मान्यता उपयोग करने के लिए कॉन्फ़िगर नहीं है।WCF उपयोगकर्ता नाम प्रमाणीकरण और गलती ठेके

अनुबंध के सभी तरीकों वापस होने के रूप में एक कस्टम सोप गलती निर्दिष्ट करने के लिए FaultContractAttribute के साथ सजाया गया है।

FaultException < टी > फेंकते समय, जहां टी FaultContractAttribute में निर्दिष्ट प्रकार है, सब कुछ अपेक्षित व्यवहार करता है और मुझे प्रतिक्रिया एक्सएमएल में कस्टम गलती मिलती है।

हालांकि, अगर मैं कोशिश करते हैं और ओवरराइड मान्य() उपयोगकर्ता नाम प्रमाणीकरण वर्ग की विधि में FaultException < टी > फेंक, मैं एक सामान्य सोप गलती निम्नलिखित कारण के साथ मिलती है:

"इस गलती के निर्माता था एक कारण निर्दिष्ट नहीं है। "

हालांकि, अगर मैं कोड बदलने में के रूप में सामान्य सोप गलती फेंकने के लिए:

throw new FaultException("Authentication failed.");

मैं कम से कम हो जाएगा "प्रमाणीकरण विफल।" कारण तत्व में।

मेरे प्रश्न हैं:

  • क्यों FaultException < टी > अपवाद ही नहीं इलाज कर रहे हैं अगर वे मान्य() के रूप में वे सेवा कार्यान्वयन के भीतर हैं में फेंक दिया रहे हैं?
  • यह मान्य() विधि FaultContractAttribute अनुबंध तरीकों पर निर्दिष्ट के अनुरूप में फेंक दिया अपवाद करना संभव है?

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

ताली

+0

इस प्रश्न पोस्ट करने के लिए धन्यवाद। कोई समाधान? मैं अभी भी मार्च 2013 में एक जवाब की तलाश में हूं। –

उत्तर

0

यह थोड़ा कष्टप्रद है, लेकिन मैं दौर यह ऐसा करने से मिला: संदेश भी शामिल है

 
SecurityTokenValidationException stve 
    = new SecurityTokenValidationException("Invalid username or password"); 
throw new FaultException<SecurityTokenValidationException>(stve, stve.Message); 

अतिरिक्त मतलब है कि आप मूर्ख "एक कारण निर्दिष्ट नहीं किया" नहीं मिलता है संदेश ।

0

समस्या यह है कि कस्टम सत्यापन कोड किसी भी विशिष्ट OperationContract के संदर्भ से बाहर चल रहा है है, इसलिए कोई FaultContract WCF संभाल करने के लिए जगह है नहीं है। तो संक्षिप्त जवाब नहीं है, आपको FaultContract का सम्मान करने के लिए अपने कस्टम सत्यापनकर्ता से अपवादों को नहीं हटाया जा सकता है।

आपके पास कुछ विकल्प यहाँ है। जिसे मैं पसंद करता हूं वह गैर-जेनेरिक FaultException फेंकना और पूर्व निर्धारित FaultCode प्रदान करना है; इस तरह मेरे पकड़ ब्लॉक "नलसाजी" दोषों से अनुबंध दोषों को अलग कर सकते हैं। ध्यान दें कि किसी भी अपवाद आप एक कस्टम सत्यापनकर्ता से फेंक वापस एक MessageSecurityException के रूप में के रूप में नीचे दिखाया गया है आना चाहिए,:

// Custom Validator: 
public override void Validate(string userName, string password) 
{ 
    throw new FaultException(
    "Invalid username or password.", 
    new FaultCode("AUTHENTICATION_FAILURE")); 
} 

// Client Code: 
try 
{ 
    client.DoSomething(); 
} 
catch (MessageSecurityException ex) 
{ 
    var inner = ex.InnerException as FaultException; 
    if (inner != null && inner.Code.Name.Equals("AUTHENTICATION_FAILURE")) 
    { 
    // Security failure. 
    } 
} 
catch (FaultException<SomethingFault> ex) 
{ 
    // Exception from the method itself. 
} 
+0

मैंने ऊपर उल्लिखित कोशिश की लेकिन मुझे एक शून्य मूल्य मिलता है जब मैं ex.innerException को FaultException के रूप में डालने का प्रयास करता हूं। किसी भी सहायता की सराहना की जाएगी। – vikasse

+0

ठीक है, आंतरिक अपवाद किस प्रकार का अपवाद है? यदि यह कोई गलती अपवाद नहीं है तो आपकी समस्या सेवा में नहीं है। –

+0

मैंने सर्वर में एक दोष अपवाद प्रकार फेंक दिया लेकिन क्लाइंट में यह कहता है कि आंतरिक अपवाद टाइप system.net.webexception है और मेरे पास सर्वर से फेंकने वाला संदेश नहीं है। – vikasse

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