कोई IUserTokenProvider पंजीकृत नहीं है


101

मैंने हाल ही में अपडेट किया है Asp.Net Identity Core में अपने आवेदन पत्र 1.0 से 2.0 तक है।

नई सुविधाएँ हैं जो मैं कोशिश करना चाहता था GenerateEmailConfirmationToken, आदि।

मैं एक संदर्भ के रूप में इस परियोजना का उपयोग कर रहा हूं ।

जब उपयोगकर्ता रजिस्टर करने की कोशिश करता है, तो मुझे रजिस्टर की पोस्ट विधि के निष्पादन के दौरान त्रुटि मिलती है

private readonly UserManager<ApplicationUser> _userManager;     

public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var ifUserEXists = _userManager.FindByName(model.EmailId);
        if (ifUserEXists == null) return View(model);
        var confirmationToken = _userRepository.CreateConfirmationToken();//this is how i'm generating token currently.                
        var result = _userRepository.CreateUser(model,confirmationToken);
        var user = _userManager.FindByName(model.EmailId);
        if (result)
        {
            var code = _userManager.GenerateEmailConfirmationToken(user.Id);//error here
            _userRepository.SendEmailConfirmation(model.EmailId, model.FirstName, confirmationToken);
            //Information("An email is sent to your email address. Please follow the link to activate your account.");
            return View("~/Views/Account/Thank_You_For_Registering.cshtml");
        }     
    }
    
    //Error("Sorry! email address already exists. Please try again with different email id.");
    ModelState.AddModelError(string.Empty, Resource.AccountController_Register_Sorry__User_already_exists__please_try_again_);
    return View(model);
}

कतार में

 var code = _userManager.GenerateEmailConfirmationToken(user.Id);

मुझे यह कहते हुए त्रुटि हुई:

No IUserTokenProvider is registered.

अभी के लिए, मैं बस यह देखना चाहता था कि यह किस प्रकार का कोड उत्पन्न करता है। क्या मुझे अपनी ApplicationUserकक्षा में कुछ बदलाव करने की ज़रूरत है जो कक्षा से विरासत में मिली है IdentityUser?

या उन कार्य को प्राप्त करने के लिए मुझे कुछ बदलने की आवश्यकता है?


1
क्या कोई तरीका है जिससे आप जांच सकते हैं कि कोई उपयोगकर्ता ईमेल पते के अलावा अन्य क्षेत्रों के आधार पर मौजूद है या नहीं? उदाहरण के लिए, अगर मेरे पास दो ऐसे ग्राहक हैं, जो उन ग्राहकों के लिए ग्राहक और पोस्टकोड कहलाते हैं, जो पहले से ही डेटाबेस में मौजूद हैं, तो किसी को भी पंजीकरण करने से रोकने के लिए
Jay

जवाबों:


127

आपको UserTokenProviderटोकन जेनरेट करने के लिए निर्दिष्ट करना होगा ।

using Microsoft.Owin.Security.DataProtection;
using Microsoft.AspNet.Identity.Owin;
// ...

var provider = new DpapiDataProtectionProvider("SampleAppName");

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
    provider.Create("SampleTokenName"));

आपको इस लेख को भी पढ़ना चाहिए: ASP.NET आइडेंटिटी का उपयोग करके एक एप्लिकेशन में दो फैक्टर ऑथेंटिकेशन जोड़ना


5
क्या कर रहे हैं "Sample"और "EmailConfirmation"? कुछ पाठ जो कुछ भी हो सकते हैं?
साइबर क्रॉप

2
"नमूना" = AppName, "EmailConfirmation" = उद्देश्य (पैरामीटर नाम की तरह)
meziantou

5
हां, लेकिन आपको टोकन के सृजन और सत्यापन के लिए समान का उपयोग करना होगा
meziantou

1
लिंक ठीक है। आपने यह कोड डाल दिया है जहाँ आपUserManager
meziantou

यह कारण 'में लोड नहीं कर सका प्रकार' System.Security.Cryptography.DpapiDataProtector विधानसभा में से .netcore
TAHA SULTAN TEMURI

25

ASP.NET Core में आजकल Startup.cs में एक डिफ़ॉल्ट सेवा को कॉन्फ़िगर करना संभव है:

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

इस DpapiDataProtectionProviderतरह से या कुछ भी कॉल करने की आवश्यकता नहीं है। DefaultTokenProviders () UserManager से GenerateEmailConfirmationToken पर कॉल का ध्यान रखेगा।


21

स्वीकृत उत्तर के अलावा, मैं यह जोड़ना चाहूंगा कि यह दृष्टिकोण एज़्योर वेब-साइट्स में काम नहीं करेगा, आपको टोकन के बजाय क्रिप्टोग्राफ़िक एक्सेप्शन मिलेगा।

Azure के लिए इसे ठीक करने के लिए, अपना खुद का IDataProtector लागू करें: इस उत्तर को देखें

ब्लॉग-पोस्ट में थोड़ा और विस्तार


13

मेरा समाधान:

    var provider = new DpapiDataProtectionProvider("YourAppName");
    UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken")) 
        as IUserTokenProvider<User, string>;

इस कोड के साथ मेरी समस्या हल हो गई।
सौभाग्य मित्रों।


Microsoft.Owin.Security.DataProtection का उपयोग कर;
बजे अमीन घुदेरी

मुझे अन्य जेनरिक के लिए <User, string> के बजाय DataProtectorTokenProvider <IdentityUser, string> का उपयोग करना था। इसके अलावा GeneratePasswordResetToken में userId गाइड स्ट्रिंग आईडी है न कि यूजरनेम या ईमेल।
दान रैंडोल्फ

7

मामले में कोई और भी वही गलती करता है जो मैंने किया था। मैंने नीचे दिए गए एक फंक्शन को बनाने की कोशिश की और निश्चित रूप से पर्याप्त त्रुटि "कोई IUserTokenProvider पंजीकृत नहीं है।" चला गया था। हालाँकि जैसे ही मैंने "callbackUrl" से उत्पन्न लिंक का उपयोग करने की कोशिश की, मुझे त्रुटि "अमान्य टोकन" मिली। इसे काम करने के लिए आपको HttpContext UserManager को प्राप्त करने की आवश्यकता है। यदि आप अलग-अलग उपयोगकर्ता खातों के साथ ASP.NET MVC 5 एप्लिकेशन का उपयोग कर रहे हैं, तो आप इसे नीचे की तरह कर सकते हैं ..

कोड जो काम करता है:

public ActionResult Index()
     {
         //Code to create ResetPassword URL
         var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
         var user = userManager.FindByName("useremail@gmail.com");
         string code = userManager.GeneratePasswordResetToken(user.Id);
         var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
         return View();
     }

पहले प्रयास करें कि काम नहीं करता है, No IUserTokenProvider is registered.चला गया है लेकिन बनाया गया URL मिलता है Invalid token.

public ActionResult NotWorkingCode()
     {
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
             var provider = new DpapiDataProtectionProvider("ApplicationName");
             var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
             userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
             var user = userManager.FindByName("useremail@gmail.com");
             string code = userManager.GeneratePasswordResetToken(user.Id);
             var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
         return View();
     }

5

ऊपर के अनुसार

स्टार्टअप में। आप उपयोग कर सकते हैं

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

.Net कोर 2.0 में आपको स्टार्टअप से जुड़ना पड़ सकता है।

using Microsoft.AspNetCore.Identity;

इसने मेरे लिए ठीक काम किया।


1
मुझे लगता है कि यह याद रखना महत्वपूर्ण है कि यह एक एस्प .NET कोर समाधान है, यह Asp .NET फ्रेमवर्क के साथ काम नहीं करेगा।
मचाडो

3

.NET कोर की पहचान फ़ाइलों को संशोधित करते हुए, मैं इस त्रुटि पर ठोकर खाई:

NotSupportedException: No IUserTwoFactorTokenProvider नाम 'Default' पंजीकृत है।

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

फ़ंक्शन एक टोकन उत्पन्न नहीं कर सका क्योंकि एक नया उपयोगकर्ता पंजीकृत करने पर कोई प्रदाता उपलब्ध नहीं था। हालाँकि इस त्रुटि का आसान समाधान है!

यदि आप मेरे जैसे हैं, तो आप फ़ाइल AddDefaultIdentityमें बदल Startup.csगए हैं AddIdentity। मैं अपने स्वयं के उपयोगकर्ता को लागू करना चाहता था जो आधार उपयोगकर्ता से विरासत में मिला। ऐसा करने से मैंने डिफ़ॉल्ट टोकन प्रदाताओं को खो दिया। उन्हें वापस जोड़ने के लिए फिक्स था AddDefaultTokenProviders()

        services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

उस फिक्स के बाद, सब कुछ फिर से काम किया!

स्रोत: https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-onym-default-registered


1

आइडेंटिटी को अपडेट करने के बाद मुझे वही त्रुटि मिली, और पाया कि ऐसा इसलिए था क्योंकि मैं यूनिटी का उपयोग कर रहा था।

इस प्रश्न को हल पर देखें: IAuthenticationManager को एकता के साथ पंजीकृत करें

त्वरित संदर्भ के लिए नीचे भी:

यहाँ मैंने ASP.NET पहचान 2.0 के साथ एकता प्ले को अच्छा बनाने के लिए क्या किया है:

मैंने कक्षा RegisterTypesमें निम्नलिखित विधि जोड़ी UnityConfig:

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<AccountController>(new InjectionConstructor());

1
मैंने इसका अनुसरण किया, लेकिन यह काम नहीं किया (के लिए GeneratePasswordResetToken- लेकिन "कोई IUserTokenProvider पंजीकृत है") की समान त्रुटि मिली।) जोड़ने के बाद container.RegisterType<ApplicationUserManager>( new InjectionFactory(c => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()));करने के लिए UnityConfig.cs, यह काम किया।


0

IdentityConfig.cs में, अपना दो विकल्प जोड़ें:

        manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        //config sms service 
        manager.SmsService = new Services.SMS();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.