2016-01-26 28 views
5

パスワードリセットトークンを生成する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) 

答えて

1

私はこの質問を読んだ後に問題が見つかりました: Make ASP.NET Identity 2.0 Email confirm token work for WCF and MVC

を私の場合はIISが実行時にマシンキーを生成するように構成されたトークンは、すべて私のコードだった場合でも無効である理由です単一のアプリケーションとして動作します。 Automatically generate at runtime should be unchecked

ここでは、IISのマシンキー構成するためのガイドです:How to Generate Machine Key using IIS

関連する問題