ASP.NET Identity 1.1 のナイトリー ビルドでパスワード リセット機能を実装しようとしています。UserManager.GetPasswordResetToken メソッドがありますが、「ITokenProvider が登録されていません」という例外がスローされます。ASP.NET ID に組み込みのトークン プロバイダーはありますか? はいの場合、どうすれば登録できますか?いいえの場合、どのように実装できますか? 1.1 ではデフォルトのトークン プロバイダーになります。リリース?最後の質問ですが、1.1 のリリース予定日はありますか?
4 に答える
AspNet.Identity 2.0 beta1 バージョンで解決策を探している人。
これだけを変更する必要があります。
UserManager.UserTokenProvider = new DataProtectorTokenProvider
<SecurityUser, string>(provider.Create("UserToken"))
as IUserTokenProvider<SecurityUser, string>;
PasswordResetTokens
プロパティにUserConfirmationTokens
マージされUserTokenProvider
、トークン プロバイダー クラスも変更されます。
デフォルトのトークン プロバイダーの実装は、Microsoft.Identity.Owin
パッケージに含まれています。
/// <summary>
/// Token provider that uses a DataProtector to generate encrypted tokens
/// </summary>
public class DataProtectorTokenProvider : ITokenProvider {
public DataProtectorTokenProvider(IDataProtector protector)
そして、OWIN の既定のデータ保護プロバイダーを使用して、次のように接続します。IAppBuilder
IDataProtectionProvider provider = app.GetDataProtectionProvider();
if (provider != null)
{
manager.PasswordResetTokens = new DataProtectorTokenProvider(provider.Create("PasswordReset"));
manager.UserConfirmationTokens = new DataProtectorTokenProvider(provider.Create("ConfirmUser"));
}
これを行う別の方法(他の回答に基づいて構築しますが、いくつか単純化します)は、Startup.Auth.cs
次のように変更することです。
public partial class Startup
{
internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
public void ConfigureAuth(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();
}
}
次に、デフォルトのコンストラクターを次のAccountController.cs
ように変更します。
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
if (Startup.DataProtectionProvider != null)
{
this.UserManager.PasswordResetTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("PasswordReset"));
this.UserManager.UserConfirmationTokens = new DataProtectorTokenProvider(Startup.DataProtectionProvider.Create("ConfirmUser"));
}
}
わかりました、@ hao-kung の返信に基づいて自分の質問に答えます。最初に静的コンストラクターと UserManagerFactory を Statrup クラス (startup.auth.cs) に追加します。
public partial class Startup
{
static Startup()
{
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
}
public static Func<UserManager<IdentityUser>> UserManagerFactory { get; set; }
public void ConfigureAuth(IAppBuilder app)
{
var manager = UserManagerFactory();
IDataProtectionProvider provider = app.GetDataProtectionProvider();
if (provider != null)
{
manager.PasswordResetTokens = new DataProtectorTokenProvider(provider.Create("PasswordReset"));
manager.UserConfirmationTokens = new DataProtectorTokenProvider(provider.Create("ConfirmUser"));
}
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
}
次に、その UserManagerFactory を使用して AccountController で UserManager を初期化します
public AccountController() : this(Startup.UserManagerFactory())
{
}
public AccountController(UserManager<IdentityUser> userManager)
{
UserManager = userManager;
}
public UserManager<IdentityUser> UserManager { get; private set; }