8

ASP.NET Identity 1.1 のナイトリー ビルドでパスワード リセット機能を実装しようとしています。UserManager.GetPasswordResetToken メソッドがありますが、「ITokenProvider が登録されていません」という例外がスローされます。ASP.NET ID に組み込みのトークン プロバイダーはありますか? はいの場合、どうすれば登録できますか?いいえの場合、どのように実装できますか? 1.1 ではデフォルトのトークン プロバイダーになります。リリース?最後の質問ですが、1.1 のリリース予定日はありますか?

4

4 に答える 4

19

AspNet.Identity 2.0 beta1 バージョンで解決策を探している人。

これだけを変更する必要があります。

UserManager.UserTokenProvider = new DataProtectorTokenProvider
<SecurityUser, string>(provider.Create("UserToken")) 
as IUserTokenProvider<SecurityUser, string>;

PasswordResetTokensプロパティにUserConfirmationTokensマージされUserTokenProvider、トークン プロバイダー クラスも変更されます。

于 2014-02-14T10:16:54.407 に答える
7

デフォルトのトークン プロバイダーの実装は、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"));
}
于 2013-10-23T18:04:00.547 に答える
5

これを行う別の方法(他の回答に基づいて構築しますが、いくつか単純化します)は、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"));
     }
 }
于 2013-10-26T18:09:17.280 に答える
1

わかりました、@ 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; }
于 2013-10-24T13:35:06.413 に答える