কোনও 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
ইমেল ঠিকানার চেয়ে অন্য ক্ষেত্রের ভিত্তিতে কোনও ব্যবহারকারীর উপস্থিতি আছে কিনা তা আপনি পরীক্ষা করে দেখতে পারেন কি? উদাহরণস্বরূপ যদি আমার কাছে গ্রাহক
জে

উত্তর:


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
"নমুনা" = অ্যাপনাম, "ইমেলকনফর্মেশন" = উদ্দেশ্য (প্যারামিটারের নামগুলির মতো)
মেজিয়েন্টাউ

5
হ্যাঁ, তবে টোকেন তৈরি ও বৈধ করার জন্য আপনাকে একই ব্যবহার করতে হবে
meziantou

1
লিঙ্কটি ঠিক আছে। এই কোডটি যেখানে আপনি আরম্ভ করাUserManager
meziantou

এটি নেট.কমরে সমাবেশ থেকে 'সিস্টেম.সিকিউরিটি.ক্রিপ্টোগ্রাফি.ডাপিডিটাপ্রোটেক্টর' টাইপ 'টাইপ' লোড করতে পারছে না
তাহা সুলতান তেমুরি

25

এএসপি.নেট কোরটিতে আজকাল স্টার্টআপ.সগুলিতে ডিফল্ট পরিষেবাটি কনফিগার করা সম্ভব:

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

এর DpapiDataProtectionProviderমতো বা তেমন কিছু কল করার দরকার নেই । ডিফল্ট টোকেনপ্রভাইডার () ইউজারম্যানেজার থেকে জেনারেট ইমেইল কনফার্মেশনটোকেন কল করার যত্ন নেবে।


21

গৃহীত উত্তরের পাশাপাশি, আমি যুক্ত করতে চাই যে এই পদ্ধতি অ্যাজুরে ওয়েব সাইটগুলিতে কাজ করবে না, আপনি টোকেনের পরিবর্তে ক্রিপ্টোগ্রাফিকএক্সসেপশন পেয়ে যাবেন।

এটি অ্যাজুরে স্থির করার জন্য, আপনার নিজস্ব আইডিটাপ্রোটেক্টর বাস্তবায়ন করুন: এই উত্তরটি দেখুন

ব্লগ-পোস্টে সামান্য আরও বিশদ


13

আমার সমাধান:

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

এই কোডটির সাথে আমার সমস্যা সমাধান হয়েছে।
শুভকামনা বন্ধুরা।


মাইক্রোসফ্ট.উইন.সিকিউরিটি.ডাটাপ্রোটেকশন ব্যবহার করে;
আমিন ঘাদেরি

আমাকে উভয় জেনেরিকের জন্যই <ব্যবহারকারী, স্ট্রিং> এর পরিবর্তে ডেটাপ্রোটেক্টর টোকেনপ্রাইডার <আইডেন্টিটি ইউজার, স্ট্রিং> ব্যবহার করতে হয়েছিল। জেনারেটপ্যাসওয়ার্ডসেটটোকেন-এ ইউজারআইডিটি গাইড স্ট্রিং আইডি এবং ইউজারনেম বা ইমেল নয়।
ড্যান র্যান্ডলফ

7

যদি অন্য কেউ একই ভুল করে থাকে যা আমি করেছিলাম। আমি নীচের মত একটি ফাংশন করার চেষ্টা করেছি এবং যথেষ্ট ত্রুটিটি নিশ্চিত করে "No IUserTokenProvider নিবন্ধিত নেই।" সর্বস্বান্ত হয়েছিল. তবে "কলব্যাকআরল" থেকে উত্পন্ন লিঙ্কটি ব্যবহার করার চেষ্টা করার সাথে সাথে আমি ত্রুটি পেয়েছি "অবৈধ টোকেন"। এটি কাজ করার জন্য আপনাকে এইচটিটিপি কনটেক্সট ইউজারম্যানেজার পেতে হবে। আপনি যদি স্বতন্ত্র ব্যবহারকারীর অ্যাকাউন্টগুলির সাথে একটি স্ট্যান্ডার্ড এএসপি.নেট এমভিসি 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

উপরে pisker হিসাবে

প্রারম্ভিকাগুলিতে আপনি ব্যবহার করতে পারেন

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

। নেট কোর 2.0 এ আপনাকে স্টার্টআপ.কে যোগ করতে হতে পারে:

using Microsoft.AspNetCore.Identity;

এটি আমার পক্ষে ভাল কাজ করেছে।


1
আমি মনে করি এটি মনে রাখা গুরুত্বপূর্ণ যে এটি একটি Asp .NET কোর সমাধান, এটি Asp .NET ফ্রেমওয়ার্কের সাথে কাজ করবে না।
মাচাডো

2

.NET কোর এর পরিচয় ফাইলগুলি সংশোধন করার সময়, আমি এই ত্রুটিটিতে হোঁচট খেয়েছি:

নোট সাপোর্টড এক্সসেপশন: 'ডিফল্ট' নামে কোনও আইউজারটু ফ্যাক্টর টোকেনপ্রভাইডার নিবন্ধিত নেই।

দ্য

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

ফাংশন একটি টোকেন তৈরি করতে পারেনি কারণ কোনও নতুন ব্যবহারকারীকে নিবন্ধকরণ করার সময় কোনও সরবরাহকারীর উপস্থিতি ছিল না। যদিও এই ত্রুটিটির একটি সহজ ফিক্স রয়েছে!

আপনি যদি আমার মতো AddDefaultIdentityহন তবে আপনি Startup.csফাইলটিতে পরিবর্তন করেছেন AddIdentity। আমি বেস ব্যবহারকারীর কাছ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত আমার নিজস্ব ব্যবহারকারীর প্রয়োগ করতে চেয়েছিলাম। এটি করে আমি ডিফল্ট টোকেন সরবরাহকারীদের হারিয়েছি। ফিক্সটি ছিল তাদের সাথে ফিরে যুক্ত করা AddDefaultTokenProviders()

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

ঠিক করার পরে, সবকিছু আবার কাজ করেছে!

উত্স: https://mattferderer.com/NotSupportedException- No-IUserTwoFactorTokenProvider-tuser- নাম-default- নিবন্ধিত


1

পরিচয় আপডেট করার পরে আমি একই ত্রুটি পেয়েছি এবং খুঁজে পেয়েছি যে আমি ইউনিটি ব্যবহার করছিলাম কারণ এটি ছিল।

সমাধানের এই প্রশ্নের থ্রেডটি দেখুন: Aক্যের সাথে আইওথেনটিকেশন ম্যানেজারটি নিবন্ধ করুন

দ্রুত রেফারেন্সের জন্য নীচে:

এএসপি.নেট আইডেন্টিটি ২.০ সহ ইউনিটিটিকে সুন্দর করে তোলার জন্য আমি যা করেছি তা এখানে রয়েছে:

আমি ক্লাসে 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- তবে "নো আইউজারটোকেনপ্রাইডার নিবন্ধিত নেই" এর একই ত্রুটি পেয়েছিল)। যোগ container.RegisterType<ApplicationUserManager>( new InjectionFactory(c => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()));করার পরে UnityConfig.cs, এটি কাজ করে।

0

আপনি এখানে
সন্ধানে আগ্রহীও হতে পারেন: এএসপি.নেট আইডেন্টিটি 1.1 নাইট বিল্ডে টোকেনপ্রভাইডার কীভাবে প্রয়োগ করবেন?
মাইক্রোসফ্ট.ইডেন্টিটি.উইন প্যাকেজ থেকে ডিফল্ট টোকেন সরবরাহকারী প্রয়োগকরণ ব্যবহার করতে


0

আইডেন্টিটি কনফিগ.সি.সে, আপনার টুইফেক্টর বিকল্পটি যুক্ত করুন:

        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"));
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.