2015-10-03 6 views
5

मैं IUserStore के लिए एक कस्टम कार्यान्वयन लिख रहा हूं। बनाने की विधि के हस्ताक्षर है:IUserStore <TUser>CreateAsync: कस्टम कार्यान्वयन में विफलता का संकेत कैसे दें?

public async virtual Task CreateAsync(TUser user) 

और वह (जो एक ही है) Microsoft.AspNet.Identity में मुख्य इंटरफ़ेस IUserStore विचार कर रहा है समझ में आता है।

हालांकि UserManager वर्ग Microsoft.AspNet.Identity में परिभाषित के इंटरफेस है:

public virtual Task<IdentityResult> CreateAsync(TUser user); 

मेरे समस्या मैं नहीं दिख रहा है कि कैसे मैं में वापसी प्रकार के बाद से UserManager को यह IdentityResult पास करना चाहिए है दुकान बस "कार्य" है। मेरे पास यह निर्धारित करने के लिए एक कस्टम तर्क है कि कोई उपयोगकर्ता बनाया या नहीं बनाया जा सकता है, इसलिए मुझे UserManager में CreateAsync के परिणाम बताने की ज़रूरत है।

कोई विचार? वे हमेशा सच लौट

public virtual async Task<IdentityResult> CreateAsync(TUser user, 
     CancellationToken cancellationToken = default(CancellationToken)) 
    { 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user, cancellationToken); 
     var result = await ValidateUserInternal(user, cancellationToken); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (Options.Lockout.EnabledByDefault && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, cancellationToken); 
     } 
     await UpdateNormalizedUserNameAsync(user, cancellationToken); 
     await Store.CreateAsync(user, cancellationToken); 
     return IdentityResult.Success; 
    } 

तो मूल रूप से:

+0

आपके आवेदन प्रवाह में, जब कोई उपयोगकर्ता नहीं बनाया जा सकता है, तो क्या यह एक असाधारण मामला है या निष्पादन के सामान्य प्रवाह का वह हिस्सा है? –

+0

@YuvalItzchakov आपकी रुचि के लिए धन्यवाद! यह निष्पादन के सामान्य प्रवाह का हिस्सा है। अधिक संदर्भ देने के लिए, मैं एक अलग असेंबली में एएसपी। इडेंटिटी का अपना कस्टम कार्यान्वयन कर रहा हूं, यही कारण है कि मैं इस मामले को सीधे उपयोगकर्ता स्टोयर में संभालना चाहता हूं ताकि ग्राहक को तर्क तर्क – reddy

उत्तर

4

(इस पहचान 2.0 के लिए है) आप IUserStore.CreateAsync बुला है कि पहले देख सकते हैं source code for UserManager.CreateAsync को देखते हुए, यह IIdentityValidator<TUser>.ValidateAsync के लिए एक कॉल, जो वास्तव में प्रासंगिक IdentityResult वस्तु वापस जाने के लिए जिम्मेदार है बनाता है IUserStore.CreateAsync का मुख्य उद्देश्य डेटा को सहेजने वाले अंतर्निहित डेटा स्रोत को कॉल करना है। ऐसा लगता है कि आप वास्तव में IIdentityValidator<TUser> को कार्यान्वित करना चाहते हैं और इसे अपने UserManager उदाहरण पर सेट करना चाहते हैं।

+0

अहह हमने पोस्ट किया ठीक उसी समय!आपकी मदद के लिए धन्यवाद, मैं निश्चित रूप से IUserValidator – reddy

+0

@ red2nb पर एक नज़र डालेगा, मैंने गिटहब पर स्रोत भी ब्राउज़ किया था, फिर देखा कि यह एएसपी.नेट 5 के लिए था। इसलिए मैंने सिंबलसोर्स को इसके बजाय देखा। इंटरफेस को वास्तव में 'IIdentityValidator ' कहा जाता है, मैंने अपना उत्तर –

+0

अपडेट किया है वास्तव में इसके साथ अभी भी कोई समस्या है। मैं जो सत्यापन कर रहा हूं, वह एक अखंडता जांच है। UserValidator पर भरोसा करके मुझे उस संदर्भ की कमी है जिसमें इस वैलिडेटर को कहा जाता है (सृजन, अद्यतन, आदि ...)। मुझे लगता है कि यह वैधता मुख्य रूप से यह जांचने के लिए है कि गुण सेट किए गए हैं और इस तरह की चीजें हैं। – reddy

2

जवाब in the source code यहाँ है, लेखन के समय UserManager में कार्यान्वयन का एक हिस्सा है। इसका मतलब है कि वर्तमान संस्करण में, उपयोगकर्तास्टोर में अपनी सृजन जांच डालने से ढांचे के इच्छित उपयोग के खिलाफ चला जाता है।

हालांकि मैंने देखा है कि यह अगली रिलीज में बदला जाएगा। IUserStore इंटरफेस हो जाएगा:

Task<IdentityResult> CreateAsync(TUser user, CancellationToken cancellationToken); 

और UserManager कार्यान्वयन:

public virtual async Task<IdentityResult> CreateAsync(TUser user) 
    { 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user); 
     var result = await ValidateUserInternal(user); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (Options.Lockout.AllowedForNewUsers && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, CancellationToken); 
     } 
     await UpdateNormalizedUserNameAsync(user); 
     await UpdateNormalizedEmailAsync(user); 

     return await Store.CreateAsync(user, CancellationToken); 
    } 

तो UserStore में निर्माण तर्क डाल उस समय संभव नहीं होगा। यह मेरी राय में एक बेहतर तरीका होगा क्योंकि ग्राहक को अखंडता चिंताओं को संभालना नहीं चाहिए।

public virtual async Task<IdentityResult> CreateAsync(TUser user) 
{ 
     ThrowIfDisposed(); 
     await UpdateSecurityStampInternal(user).ConfigureAwait(false); 
     var result = await UserValidator.ValidateAsync(user).ConfigureAwait(false); 
     if (!result.Succeeded) 
     { 
      return result; 
     } 
     if (UserLockoutEnabledByDefault && SupportsUserLockout) 
     { 
      await GetUserLockoutStore().SetLockoutEnabledAsync(user, true).ConfigureAwait(false); 
     } 
     await Store.CreateAsync(user).ConfigureAwait(false); 
     return IdentityResult.Success; 
} 

:

+1

पर ध्यान केंद्रित किया जा सके * तो मूल रूप से वे हमेशा सच होते हैं । * यदि आप कोड पर फिर से देखते हैं, तो आप देखेंगे कि यदि 'ValidateAsync' पर कॉल सफलता के अलावा कुछ भी लौटाता है, तो यह' IdentityResult' वापस आ जाएगा जिसमें त्रुटियां होंगी। तो यह वास्तव में हमेशा सच नहीं आ रहा है। –

+0

क्या आप कृपया इस प्रश्न के साथ मेरी सहायता कर सकते हैं: http: //stackoverflow.com/questions/39275597/how-to-give-custom-implementation-of-updateasync-method-of-asp-net-identity –

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