私は最近、アプリケーションフォームの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
クラスに変更を加える必要がありますか?
または、それらの機能を動作させるために変更する必要があるものはありますか?
トークンを生成するには、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要素認証の追加 。
ASP.NET Coreでは、現在、Startup.csで次のようにデフォルトサービスを構成できます。
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddDefaultTokenProviders();
DpapiDataProtectionProvider
またはそのようなものを呼び出す必要はありません。 DefaultTokenProviders()は、UserManagerからGenerateEmailConfirmationTokenの呼び出しを処理します。
私の解決策:
var provider = new DpapiDataProtectionProvider("YourAppName");
UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken"))
as IUserTokenProvider<User, string>;
このコードに関する私の問題は解決しました。
幸運の友人
他の誰かが私と同じ間違いをした場合に備えて。以下のような関数を作成して、「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();
}
上記のピスカーによると
Startup.csで使用できます
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddDefaultTokenProviders();
.net core 2.0では、startup.csに追加する必要がある場合があります。
using Microsoft.AspNetCore.Identity;
これは私にとってはうまくいきました。
こちらもご覧ください:
ASP.NET Identity 1.1ナイトリービルドでのTokenProviderの実装方法
Microsoft.Identity.Owinパッケージのデフォルトのトークンプロバイダー実装を使用する
.NET CoreのIDファイルを変更しているときに、このエラーを見つけました。
NotSupportedException: 'Default'という名前のIUserTwoFactorTokenProviderは登録されていません。
の
Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync
新しいユーザーの登録時にプロバイダーが使用できなかったため、関数はトークンを生成できませんでした。このエラーは簡単に修正できます!
あなたが私のような場合、Startup.cs
ファイルのAddDefaultIdentity
をAddIdentity
に変更しました。基本ユーザーから継承した自分のユーザーを実装したかった。これを行うことで、デフォルトのトークンプロバイダーを失いました。修正は、AddDefaultTokenProviders()
でそれらを追加し直すことでした。
services.AddIdentity<User, UserRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
その修正後、すべてが再び機能しました!
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"));
}
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());