Hiçbir IUserTokenProvider kayıtlı değil


102

Yakın zamanda Asp.Net Identity Core1.0'dan 2.0'a başvuru formumu güncelledim .

Denemek istediğim yeni özellikler var GenerateEmailConfirmationTokenvs.

Bu projeyi referans olarak kullanıyorum .

Kullanıcı kayıt olmaya çalıştığında Register'ın Post metodu çalıştırılırken hata alıyorum

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);
}

Çizgide

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

Derken hata alıyorum:

No IUserTokenProvider is registered.

Şimdilik, sadece ne tür bir kod oluşturduğunu görmek istedim. ApplicationUserSınıfımda IdentityUsersınıftan miras alan bazı değişiklikler yapmam gerekiyor mu?

Yoksa bu işlevi çalıştırmak için değiştirmem gereken bir şey mi var?


1
E-posta adresi dışındaki alanlara dayalı olarak bir kullanıcının var olup olmadığını kontrol etmenin bir yolu var mı? Mesela ben kayıt sadece herkes durdurmak için zaten veritabanında mevcut ön olurdu kullanıcılar için CUSTOMERNUMBER ve Posta Kodu denilen iki alan olsaydı
Jay

Yanıtlar:


127

UserTokenProviderBir belirteç oluşturmak için bir belirtmelisiniz .

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"));

Ayrıca şu makaleyi de okumalısınız: ASP.NET Kimliğini Kullanan Bir Uygulamaya İki Faktörlü Kimlik Doğrulama Ekleme .


5
nedir "Sample"ve "EmailConfirmation"? herhangi bir şey olabilen bir metin?
Cybercop

2
"Örnek" = UygulamaAdı, "EmailConfirmation" = amaç (parametre adları gibi)
meziantou

5
Evet, ancak jeton oluşturmak ve doğrulamak için aynısını kullanmanız gerekecek
meziantou

1
Bağlantı tamam. Bu kodu başlattığınız yere UserManager
koyarsınız

bu, .netcore'daki derlemeden 'System.Security.Cryptography.DpapiDataProtector' yüklenemedi
TAHA SULTAN TEMURI

25

ASP.NET Core'da bugünlerde Startup.cs'de varsayılan bir hizmeti şu şekilde yapılandırmak mümkündür:

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

Aramaya DpapiDataProtectionProviderveya onun gibi bir şeye gerek yok . DefaultTokenProviders (), UserManager'dan GenerateEmailConfirmationToken çağrısıyla ilgilenir.


21

Kabul edilen cevaba ek olarak, bu yaklaşımın Azure Web Sitelerinde çalışmayacağını, belirteç yerine CryptographicException alacağınızı eklemek isterim.

Azure için düzeltmek için kendi IDataProtector'ınızı uygulayın: bu yanıta bakın

Blog gönderisinde biraz daha fazla ayrıntı


13

Çözümüm :

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

Bu kodla ilgili sorunum çözüldü.
İyi şanslar arkadaşlar.


Microsoft.Owin.Security.DataProtection kullanarak;
Amin Ghaderi

Her iki jenerik için <User, string> yerine DataProtectorTokenProvider <IdentityUser, string> kullanmak zorunda kaldım. Ayrıca GeneratePasswordResetToken'daki userId, userName veya Email değil, kılavuz dizesi Id'dir.
Dan Randolph

7

Benim yaptığım hatayı başkası yaparsa diye. Aşağıdaki gibi bir işlev yapmaya çalıştım ve "No IUserTokenProvider kayıtlı değil" hatasını yeterince belirledim. gitmişti. Ancak "callbackUrl" den oluşturulan bağlantıyı kullanmaya çalışır çalışmaz "Geçersiz simge" hatasını aldım. Çalışması için HttpContext UserManager'ı edinmeniz gerekir. Bireysel kullanıcı hesaplarıyla standart bir ASP.NET MVC 5 uygulaması kullanıyorsanız, bunu aşağıdaki gibi yapabilirsiniz ..

Çalışan kod:

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();
     }

İlk önce bu işe yaramaz, No IUserTokenProvider is registered.gitti ama oluşturulan URL alır 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

Yukarıdaki dikdörtgene göre

Startup.cs'de kullanabilirsiniz

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

.Net core 2.0'da startup.cs dosyasına eklemeniz gerekebilir:

using Microsoft.AspNetCore.Identity;

Bu benim için iyi çalıştı.


1
Bunun bir Asp .NET Core çözümü olduğunu hatırlamanın önemli olduğunu düşünüyorum, Asp .NET Framework ile çalışmayacaktır.
Machado

4

.NET Core'un Kimlik dosyalarını değiştirirken, şu hatayla karşılaştım:

NotSupportedException: 'Default' adlı IUserTwoFactorTokenProvider kayıtlı değil.

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

yeni bir kullanıcı kaydedildiğinde hiçbir sağlayıcı kullanılamadığından işlev bir simge oluşturamadı. Bu hatanın kolay bir düzeltmesi var!

Benim gibiyseniz AddDefaultIdentity, Startup.csdosyayı olarak değiştirdiniz AddIdentity. Temel kullanıcıdan miras alınan kendi kullanıcımı uygulamak istedim. Bunu yaparak varsayılan belirteç sağlayıcılarını kaybettim. Düzeltme onları tekrar eklemekti AddDefaultTokenProviders().

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

Bu düzeltmeden sonra her şey tekrar çalıştı!

kaynak: https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-named-default-registered


1

Identity'yi güncelledikten sonra aynı hatayı aldım ve bunun Unity kullandığım için olduğunu öğrendim.

Çözümle ilgili şu soru dizisine bakın: IAuthenticationManager'ı Unity'ye Kaydettirin

Ayrıca hızlı başvuru için aşağıda:

Unity'nin ASP.NET Identity 2.0 ile iyi oynamasını sağlamak için yaptığım şey:

Sınıftaki RegisterTypesyönteme şunları ekledim 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
Bunu takip ettim, ancak işe yaramadı (için GeneratePasswordResetToken- ancak aynı "No IUserTokenProvider kayıtlı" hatasını aldım). Ekledikten sonra container.RegisterType<ApplicationUserManager>( new InjectionFactory(c => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()));için UnityConfig.cs, işe yaradı.


0

IdentityConfig.cs içinde, twofactor seçeneğinizi ekleyin:

        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"));
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.