web-dev-qa-db-ja.com

IUserTokenProviderが登録されていません

私は最近、アプリケーションフォームのAsp.Net Identity Coreを1.0から2.0に更新しました。

GenerateEmailConfirmationTokenなどのように試してみたい新しい機能があります。

this プロジェクトを参照として使用しています。

ユーザーが登録しようとすると、RegisterのPostメソッドの実行中にエラーが発生します

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クラスに変更を加える必要がありますか?

または、それらの機能を動作させるために変更する必要があるものはありますか?

94
Cybercop

トークンを生成するには、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 IDを使用したアプリケーションへの2要素認証の追加

121
meziantou

受け入れられた回答に加えて、このアプローチはAzure Webサイトでは機能しないことを付け加えます。トークンではなくCryptographicExceptionが発生します。

Azure向けに修正するには、独自のIDataProtectorを実装します。 この回答を参照

blog-post でもう少し詳しく

20
trailmax

ASP.NET Coreでは、現在、Startup.csで次のようにデフォルトサービスを構成できます。

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

DpapiDataProtectionProviderまたはそのようなものを呼び出す必要はありません。 DefaultTokenProviders()は、UserManagerからGenerateEmailConfirmationTokenの呼び出しを処理します。

20
pisker

私の解決策:

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

このコードに関する私の問題は解決しました。
幸運の友人

11
Amin Ghaderi

他の誰かが私と同じ間違いをした場合に備えて。以下のような関数を作成して、「No IUserTokenProvider is registered。」というエラーを十分に確認しようとしました。行ってしまった。しかし、「callbackUrl」から生成されたリンクを使用しようとするとすぐに、「Invalid token」というエラーが表示されました。動作させるためには、HttpContext UserManagerを取得する必要があります。個々のユーザーアカウントで標準のASP.NET MVC 5アプリケーションを使用している場合、以下のように実行できます。

動作するコード:

public ActionResult Index()
     {
         //Code to create ResetPassword URL
         var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
         var user = userManager.FindByName("[email protected]");
         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("[email protected]");
             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();
     }
7
Ogglas

上記のピスカーによると

Startup.csで使用できます

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

.net core 2.0では、startup.csに追加する必要がある場合があります。

using Microsoft.AspNetCore.Identity;

これは私にとってはうまくいきました。

5
ScottC

こちらもご覧ください:
ASP.NET Identity 1.1ナイトリービルドでのTokenProviderの実装方法
Microsoft.Identity.Owinパッケージのデフォルトのトークンプロバイダー実装を使用する

0
botang

.NET CoreのIDファイルを変更しているときに、このエラーを見つけました。

NotSupportedException: 'Default'という名前のIUserTwoFactorTokenProviderは登録されていません。

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

新しいユーザーの登録時にプロバイダーが使用できなかったため、関数はトークンを生成できませんでした。このエラーは簡単に修正できます!

あなたが私のような場合、Startup.csファイルのAddDefaultIdentityAddIdentityに変更しました。基本ユーザーから継承した自分のユーザーを実装したかった。これを行うことで、デフォルトのトークンプロバイダーを失いました。修正は、AddDefaultTokenProviders()でそれらを追加し直すことでした。

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

その修正後、すべてが再び機能しました!

ソース: https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-named-default-registered

0
Yawar Ali

identityConfig.csで、twofactorオプションを追加します。

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

Identityを更新した後も同じエラーが発生し、Unityを使用していたことが原因であることがわかりました。

ソリューションに関する次の質問スレッドを参照してください。 nityにIAuthenticationManagerを登録

クイックリファレンスのために以下も参照してください。

以下は、ASP.NET Identity 2.0でUnityをナイスにプレイするためにしたことです。

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());
0
Rob