パスワードリセットトークンを生成するWebapiサービスがあります。
トークン生成サービスのエンドポイント:ASP.NET ID WebAPI無効なパスワードリセットトークン
[Authorize(Users = "abcd")]
[HttpGet]
[ActionName("GenerateForgotPasswordToken")]
public async Task<IHttpActionResult> GenerateForgotPasswordToken(string key)
{
if (key == null || UserManager.FindById(key) == null)
{
return InternalServerError(new Exception("User not found"));
}
return Ok(await UserManager.GeneratePasswordResetTokenAsync(key));
}
私のアプリケーションのUserManager:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
//var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
var manager = new ApplicationUserManager(new UserStore<IdentityUser>(new MTA()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<IdentityUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
トークンは、ユーザーにパスワードのリセットのURLを送信する電子メールに使用されます。このURLは、WebAPIプロジェクトの一部であるASP.NET MVCビューを指し、明らかにIISの同じWebアプリケーションでホストされます。ページのパスワードリセットボタンは、パスワードをリセットする他のサービスエンドポイントを呼び出します。
Passowrdは、サービスエンドポイントをリセット:
[HttpGet]
[AllowAnonymous]
public async Task<HttpResponseMessage> ResetPassword([FromUri]string email,[FromUri]string code,[FromUri]string password)
{
var user = await UserManager.FindByEmailAsync(email);
var result = await UserManager.ResetPasswordAsync(user.Id, code, password);
if (result.Succeeded)
{
return Request.CreateResponse();
}
return Request.CreateResponse(System.Net.HttpStatusCode.Ambiguous);
}
また、それは、両方のそれらのWeb APIエンドポイントは、同じコントローラで、次のように私はグローバルUserMangerを定義したコントローラであることを言及するのに役立つかもしれない:
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
を
高度なRESTクライアントのような外部ツールを使用すると、最初のエンドポイントを押してトークンを生成し、電子メールと新しいパスワードと共にトークンを2番目のエンドポイントに渡して、パスワードを正常にリセットできます。しかし、私のASP.NET MVCコントローラが最初のエンドポイントによって生成された同じトークンを使用し、passwordResetエンドポイントを呼び出すとき、トークンは無効です!私はすでにエンコード/デコードの問題がないことを確認し、第2のエンドポイントで受け取ったトークンは両方のテストで同じであることを確認します。
私のWebApiとASPコントローラは同じプロジェクトにあり、同じWebアプリケーションでホストされています。 この問題は、トークンプロバイダのリクエストに関連している可能性があります。なぜなら、リクエストは、OwinContextに基づいていますが、なぜWebブラウザ経由で呼び出すのか分かりません。
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)