2015-01-12 12 views
20

बिना उपयोगकर्ता को बचाने मैं ईमेल के बिना उपयोगकर्ता को बचाने के लिए, इस तरह हैं:Asp.Net पहचान ईमेल

var user = new ApplicationUser { UserName = model.Name }; 
var result = await UserManager.CreateAsync(user); 

लेकिन मैं त्रुटि "ईमेल शून्य या रिक्त नहीं हो सकता है" मिला है। क्या इसका कोई समाधान है? या यह असंभव है?

उत्तर

6

पहचान उपयोगकर्ता पासवर्ड को रीसेट करने के तरीके के रूप में ईमेल पर निर्भर करती है।

हालांकि, ईमेल को अनदेखा करना आसान नहीं है, लेकिन संभव है।

namespace Microsoft.AspNet.Identity 
{ 
    /// <summary> 
    /// Used to validate an item 
    /// 
    /// </summary> 
    /// <typeparam name="T"/> 
    public interface IIdentityValidator<in T> 
    { 
    /// <summary> 
    /// Validate the item 
    /// 
    /// </summary> 
    /// <param name="item"/> 
    /// <returns/> 
    Task<IdentityResult> ValidateAsync(T item); 
    } 
} 

और फिर ApplicationUserManager में संपत्ति UserValidator लिए अपने स्वयं के कार्यान्वयन आवंटित: आप Microsoft.AspNet.Identity.IIdentityValidator इंटरफ़ेस है कि ईमेल की कमी पर ध्यान नहीं देता लागू करने के लिए की आवश्यकता होगी।

यदि आपको वास्तव में इसकी आवश्यकता है, तो आप UserValidator के लिए Microsoft.AspNet.Identity.UserValidator कक्षा को डीकंपलिंग करके और मौजूदा स्रोत कोड में देखकर और ईमेल के लिए चीकिंग को हटाकर मूल स्रोत कोड प्राप्त कर सकते हैं।

हालांकि, मुझे यकीन नहीं है कि बाकी फ्रेमवर्क उपयोगकर्ता पर ईमेल की कमी पर प्रतिक्रिया कैसे करेगा। शायद आपको अन्य परिचालनों में अपवाद मिलेंगे।

68

मुझे पता है कि यह पुराना है, लेकिन मैं स्वीकार किए गए उत्तर से असहमत हूं, क्योंकि सवाल को एएसपीनेट-पहचान -2 के रूप में टैग किया गया है।

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    ...snip... 
    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 
     manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
     { 
      // This disables the validation check on email addresses 
      RequireUniqueEmail = false 
     }; 
     ...snip... 
    } 
} 

UserValidator<TUser> में, Task<IdentityResult> ValidateAsync(T item) कार्यान्वयन चेकों इस ध्वज और निर्धारित करता है कि यह ईमेल सत्यापन चलाना चाहिए: भविष्य पाठकों के लाभ के लिए, ASP.NET पहचान 2.0 इस समस्या का एक बहुत ही सरल समाधान है

if (this.RequireUniqueEmail) 
{ 
    await this.ValidateEmail(item, list); 
} 

चूंकि आप बिना किसी ईमेल पते के उपयोगकर्ताओं को सहेजना चाहते हैं, तो आपको यह करना चाहिए।

सावधानी: इसका उपयोग तब किया जाना चाहिए जब ईमेल पते एकत्र नहीं किए जाते हैं। यदि आप ईमेल पते एकत्र और मान्य करना चाहते हैं, लेकिन पंजीकरण के दौरान उन्हें वैकल्पिक बनाते हैं, तो आपको कस्टम IIdentityValidator का उपयोग करना चाहिए।

+2

प्लस वन आपके अवतार के लिए। ... और सवाल का सही जवाब, ज़ाहिर है! :) –

21

एएसपी पहचान 2,2 App_Start\IdentityConfig.cs

manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
    { 
     AllowOnlyAlphanumericUserNames = false, 
     RequireUniqueEmail = false 
    }; 
0

असल में वहाँ एक बेहतर तरीका है में सेट किया जा सकता है। केवल उस समय के लिए सत्यापन को बदलें जब आपको इसे अनदेखा करने की आवश्यकता हो और फिर पूर्ण होने पर इसे वापस बहाल करें। (इस मामले में async का उपयोग न करें क्योंकि

// first create/update the identity!!! 
user.PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password); //hash and update directly 

// alter 
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager) 
{ 
    AllowOnlyAlphanumericUserNames = false, 
    RequireUniqueEmail = false 
}; 

var result = UserManager.Update(user); 

// restore... 
UserManager.UserValidator = new UserValidator<StoreUser>(UserManager) 
{ 
    AllowOnlyAlphanumericUserNames = false, 
    RequireUniqueEmail = true 
}; 
+0

यह वास्तव में एक बहुत बुरा विचार है। क्या होता है यदि दो लोग एक ही समय में अपने उपयोगकर्ता को अपडेट करते हैं? [रेस हालत] (https://en.wikipedia.org/wiki/Race_condition) यही है। आप इसे स्टार्टअप पर एक बार क्यों सेट नहीं करेंगे जैसे हर कोई सुझाव देता है? – Liam

+0

क्या होगा अगर मैं ई-मेल और उसके संबंधित फ़ील्ड को स्टोर करना चाहता हूं तो अब AspNetUsers में एक अलग तालिका में पाया गया है? फ़ोन फ़ील्ड के साथ ही? – muybn

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