Mam usługę Webapi, która generuje hasło Resetuj token.
Reklamowe punkt końcowy usługi generacja:ASP.NET Identity WebAPI niepoprawny token resetowania hasła
[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));
}
Moja aplikacja 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;
}
Token będą wykorzystywane w e-mail, aby wysłać adres URL do resetowania hasła użytkownika. Ten adres URL wskazuje na widok MVC ASP.NET, który jest częścią mojego projektu WebAPI i oczywiście jest hostowany w tej samej aplikacji internetowej w IIS. Przycisk resetowania hasła na stronie wywołuje mój inny punkt końcowy usługi, który resetuje hasło.
Passowrd punkt końcowy usługa resetu:
[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);
}
także może pomóc wspomnieć, że oba te punkty końcowe Web API są w tym samym kontrolerze iw sterowniku zdefiniowałem globalną UserManger następująco:
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Gdy korzystam z zewnętrznego narzędzia, takiego jak Zaawansowany klient REST, jestem w stanie trafić pierwszy punkt końcowy, aby wygenerować token, a następnie przekazać token do drugiego punktu końcowego wraz z pocztą e-mail i nowym hasłem oraz pomyślnie zresetować hasło. Jednak gdy mój kontroler ASP.NET MVC używa tokenu generowanego przez pierwszy punkt końcowy i wywołuje punkt końcowy passwordReset, token jest nieprawidłowy! Już upewniam się, że nie ma problemu z kodowaniem/dekodowaniem, a token, który jest odbierany przez drugi punkt końcowy, jest identyczny w obu testach.
Po raz kolejny wszystkie moje kontrolery WebApi i ASP są w tym samym projekcie i hostowane w tej samej aplikacji internetowej. Myślę, że problem może być związany z nowym dostawcą tokena , gdy żądanie przychodzi na podstawie OwinContext, ale nie rozumiem, dlaczego działa wywołując go za pośrednictwem przeglądarki internetowej.
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)